chiark / gitweb /
code cleanup in ultralcd.
authorBernhard Kubicek <kubicek@gmx.at>
Sun, 20 Nov 2011 10:55:33 +0000 (11:55 +0100)
committerBernhard Kubicek <kubicek@gmx.at>
Sun, 20 Nov 2011 10:55:33 +0000 (11:55 +0100)
Marlin/ultralcd.h
Marlin/ultralcd.pde

index 6bae43dccbbf15eb76a8a57e6787a447ce6be6d2..d3496bec9808b0e17544e9b2c1f2a644f1457ecd 100644 (file)
     int8_t lastlineoffset;
     
     bool linechanging;
+    
+  private:
+    inline void updateActiveLines(const uint8_t &maxlines,volatile int &encoderpos)
+    {
+      if(linechanging) return; // an item is changint its value, do not switch lines hence
+      lastlineoffset=lineoffset; 
+      int curencoderpos=encoderpos;  
+      force_lcd_update=false;
+      if(  (abs(curencoderpos-lastencoderpos)<lcdslow) ) 
+      { 
+        lcd.setCursor(0,activeline);lcd.print((activeline+lineoffset)?' ':' '); 
+        if(curencoderpos<0)  
+        {  
+          lineoffset--; 
+          if(lineoffset<0) lineoffset=0; 
+          curencoderpos=lcdslow-1; 
+          force_lcd_update=true; 
+        } 
+        if(curencoderpos>(LCD_HEIGHT-1+1)*lcdslow) 
+        { 
+          lineoffset++; 
+          curencoderpos=(LCD_HEIGHT-1)*lcdslow; 
+          if(lineoffset>(maxlines+1-LCD_HEIGHT)) 
+            lineoffset=maxlines+1-LCD_HEIGHT; 
+          if(curencoderpos>maxlines*lcdslow) 
+            curencoderpos=maxlines*lcdslow; 
+          force_lcd_update=true; 
+        } 
+        lastencoderpos=encoderpos=curencoderpos; 
+        activeline=curencoderpos/lcdslow;
+        if(activeline<0) activeline=0;
+        if(activeline>LCD_HEIGHT-1) activeline=LCD_HEIGHT-1;
+        if(activeline>maxlines) 
+        {
+          activeline=maxlines;
+          curencoderpos=maxlines*lcdslow;
+        }
+        lcd.setCursor(0,activeline);lcd.print((activeline+lineoffset)?'>':'\003');    
+      } 
+    }
+    
+    inline void clearIfNecessary()
+    {
+      if(lastlineoffset!=lineoffset ||force_lcd_update)
+      {
+        force_lcd_update=true;
+         lcd.clear();
+      } 
+    }
   };
 
   //conversion routines, could need some overworking
index c4ea234883d062b222bf0ddc8f2eee3a6c05c2f3..aa30a3dd0e7fa7d3e8ba4e9d70f47ec392540339 100644 (file)
@@ -279,7 +279,6 @@ MainMenu::MainMenu()
   linechanging=false;\r
 }\r
 \r
-\r
 void MainMenu::showStatus()\r
 { \r
 #if LCD_HEIGHT==4\r
@@ -426,131 +425,46 @@ void MainMenu::showStatus()
 \r
 enum {ItemP_exit, ItemP_home, ItemP_origin, ItemP_preheat, ItemP_extrude, ItemP_disstep};\r
 \r
+//any action must not contain a ',' character anywhere, or this breaks:\r
+#define MENUITEM(repaint_action, click_action) \\r
+  {\\r
+    if(force_lcd_update)  { lcd.setCursor(0,line);  repaint_action; } \\r
+    if((activeline==line) && CLICKED) {click_action} \\r
+  }\r
+  \r
 void MainMenu::showPrepare()\r
 {\r
  uint8_t line=0;\r
- if(lastlineoffset!=lineoffset)\r
- {\r
-   force_lcd_update=true;\r
-   clear(); \r
- }\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 ItemP_exit:\r
-      {\r
-        if(force_lcd_update)\r
-        {\r
-          lcd.setCursor(0,line);lcdprintPGM(" Prepare");\r
-        }\r
-        if((activeline==line) && CLICKED)\r
-        {\r
-          BLOCK\r
-          status=Main_Menu;\r
-          beepshort();\r
-        }\r
-      }break;\r
+      MENUITEM(  lcdprintPGM(" Prepare")  ,  BLOCK;status=Main_Menu;beepshort(); ) ;\r
+      break;\r
     case ItemP_home:\r
-      {\r
-        if(force_lcd_update)\r
-        {\r
-          lcd.setCursor(0,line);lcdprintPGM(" Auto Home");\r
-        }\r
-        if((activeline==line) && CLICKED)\r
-        {\r
-          BLOCK\r
-          enquecommand("G28 X-105 Y-105 Z0");\r
-          beepshort();\r
-        }\r
-      }break;\r
+      MENUITEM(  lcdprintPGM(" Auto Home")  ,  BLOCK;enquecommand("G28 X-105 Y-105 Z0");beepshort(); ) ;\r
+      break;\r
     case ItemP_origin:\r
-      {\r
-        if(force_lcd_update)\r
-        {\r
-          lcd.setCursor(0,line);lcdprintPGM(" Set Origin");\r
-          \r
-        }\r
-        if((activeline==line) && CLICKED)\r
-        {\r
-          BLOCK\r
-          enquecommand("G92 X0 Y0 Z0");\r
-          beepshort();\r
-        }\r
-      }break;\r
+      MENUITEM(  lcdprintPGM(" Set Origin")  ,  BLOCK;enquecommand("G92 X0 Y0 Z0");beepshort(); ) ;\r
+      break;\r
     case ItemP_preheat:\r
-      {\r
-        if(force_lcd_update)\r
-        {\r
-          lcd.setCursor(0,line);lcdprintPGM(" Preheat"); \r
-        }\r
-        if((activeline==line) && CLICKED)\r
-        {\r
-          BLOCK\r
-          setTargetHotend0(170);\r
-          beepshort();\r
-        }\r
-      }break;\r
+      MENUITEM(  lcdprintPGM(" Preheat")  ,  BLOCK;setTargetHotend0(170);beepshort(); ) ;\r
+      break;\r
     case ItemP_extrude:\r
-      {\r
-        if(force_lcd_update)\r
-        {\r
-          lcd.setCursor(0,line);lcdprintPGM(" Extrude");\r
-        }\r
-        if((activeline==line) && CLICKED)\r
-        {\r
-          BLOCK\r
-          enquecommand("G92 E0");\r
-          enquecommand("G1 F700 E50");\r
-          beepshort();\r
-        }\r
-      }break;\r
+      MENUITEM(  lcdprintPGM(" Extrude")  ,  BLOCK;enquecommand("G92 E0");enquecommand("G1 F700 E50");beepshort(); ) ;\r
+      break;\r
     case ItemP_disstep:\r
-      {\r
-        if(force_lcd_update)\r
-        {\r
-          lcd.setCursor(0,line);lcdprintPGM(" Disable Steppers");\r
-        }\r
-        if((activeline==line) && CLICKED)\r
-        {\r
-          BLOCK\r
-          enquecommand("M84");\r
-          beepshort();\r
-        }\r
-      }break;\r
+      MENUITEM(  lcdprintPGM(" Disable Steppers")  ,  BLOCK;enquecommand("M84");beepshort(); ) ;\r
+      break;\r
     default:   \r
       break;\r
   }\r
   line++;\r
  }\r
- lastlineoffset=lineoffset;\r
- if((encoderpos/lcdslow!=lastencoderpos/lcdslow)||force_lcd_update)\r
- {\r
-   \r
-    lcd.setCursor(0,activeline);lcd.print((activeline+lineoffset)?' ':' ');\r
-    \r
-    if(encoderpos<0)\r
-    {\r
-     lineoffset--;\r
-     if(lineoffset<0)\r
-       lineoffset=0;\r
-     encoderpos=0;\r
-     force_lcd_update=true;\r
-    }\r
-    if(encoderpos/lcdslow>3)\r
-    {\r
-     lineoffset++;\r
-     encoderpos=3*lcdslow;\r
-     if(lineoffset>(ItemP_disstep+1-LCD_HEIGHT))\r
-       lineoffset=ItemP_disstep+1-LCD_HEIGHT;\r
-     force_lcd_update=true;\r
-    }\r
-    //encoderpos=encoderpos%LCD_HEIGHT;\r
-    lastencoderpos=encoderpos;\r
-    activeline=encoderpos/lcdslow;\r
-    lcd.setCursor(0,activeline);lcd.print((activeline+lineoffset)?'>':'\003');   \r
-  } \r
+ updateActiveLines(ItemP_disstep,encoderpos);\r
 }\r
 enum {\r
   ItemC_exit, ItemC_nozzle, \r
@@ -563,31 +477,35 @@ enum {
   ItemC_aret,ItemC_esteps, ItemC_store, ItemC_load,ItemC_failsafe\r
 };\r
 \r
+//does not work\r
+// #define MENUCHANGEITEM(repaint_action,  enter_action, accept_action,  change_action) \\r
+//   {\\r
+//     if(force_lcd_update)  { lcd.setCursor(0,line);  repaint_action; } \\r
+//     if(activeline==line)  \\r
+//     { \\r
+//       if(CLICKED) \\r
+//       { \\r
+//         linechanging=!linechanging; \\r
+//         if(linechanging)  {enter_action;} \\r
+//         else {accept_action;} \\r
+//       }  \\r
+//       else \\r
+//       if(linechanging) {change_action};}\\r
+//   }\r
+//   \r
+\r
+  \r
 void MainMenu::showControl()\r
 {\r
  uint8_t line=0;\r
- if((lastlineoffset!=lineoffset)||force_lcd_update)\r
- {\r
-   force_lcd_update=true;\r
-   clear();\r
- }\r
+ clearIfNecessary();\r
  for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)\r
  {\r
   switch(i)\r
   {\r
     case ItemC_exit:\r
-      {\r
-        if(force_lcd_update)\r
-        {\r
-          lcd.setCursor(0,line);lcdprintPGM(" Control");\r
-        }\r
-        if((activeline==line) && CLICKED)\r
-        {\r
-          BLOCK\r
-          status=Main_Menu;\r
-          beepshort();\r
-        }\r
-      }break;\r
+      MENUITEM(  lcdprintPGM(" Control")  ,  BLOCK;status=Main_Menu;beepshort(); ) ;\r
+      break;\r
     case ItemC_nozzle:\r
       {\r
         if(force_lcd_update)\r
@@ -1134,35 +1052,7 @@ void MainMenu::showControl()
   }\r
   line++;\r
  }\r
- lastlineoffset=lineoffset;\r
-\r
- if(!linechanging &&  ((encoderpos/lcdslow!=lastencoderpos/lcdslow)||force_lcd_update))\r
- {\r
-   \r
-    lcd.setCursor(0,activeline);lcd.print((activeline+lineoffset)?' ':' ');\r
-    \r
-    if(encoderpos<0)\r
-    {\r
-     lineoffset--;\r
-     if(lineoffset<0)\r
-       lineoffset=0;\r
-     encoderpos=0;\r
-     force_lcd_update=true;\r
-    }\r
-    if(encoderpos/lcdslow>3)\r
-    {\r
-     lineoffset++;\r
-     encoderpos=3*lcdslow;\r
-     if(lineoffset>(ItemC_failsafe+1-LCD_HEIGHT))\r
-       lineoffset=ItemC_failsafe+1-LCD_HEIGHT;\r
-     force_lcd_update=true;\r
-    }\r
-    //encoderpos=encoderpos%LCD_HEIGHT;\r
-    lastencoderpos=encoderpos;\r
-    activeline=encoderpos/lcdslow;\r
-    if(activeline>3) activeline=3;\r
-    lcd.setCursor(0,activeline);lcd.print((activeline+lineoffset)?'>':'\003');   \r
-  } \r
+ updateActiveLines(ItemC_failsafe,encoderpos);\r
 }\r
 \r
 \r
@@ -1175,14 +1065,11 @@ void MainMenu::showSD()
 #ifdef SDSUPPORT\r
  uint8_t line=0;\r
 \r
- if(lastlineoffset!=lineoffset)\r
- {\r
-   force_lcd_update=true; \r
- }\r
+ clearIfNecessary();\r
  static uint8_t nrfiles=0;\r
  if(force_lcd_update)\r
  {\r
-   clear();\r
+  clear();\r
   if(card.cardOK)\r
   {\r
     nrfiles=card.getnrfilenames();\r
@@ -1192,7 +1079,6 @@ void MainMenu::showSD()
     nrfiles=0;\r
     lineoffset=0;\r
   }\r
-  //Serial.print("Nr files:"); Serial.println((int)nrfiles);\r
  }\r
  \r
  for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)\r
@@ -1200,18 +1086,8 @@ void MainMenu::showSD()
   switch(i)\r
   {\r
     case 0:\r
-      {\r
-        if(force_lcd_update)\r
-        {\r
-          lcd.setCursor(0,line);lcdprintPGM(" File");\r
-        }\r
-        if((activeline==line) && CLICKED)\r
-        {\r
-          BLOCK\r
-          status=Main_Menu;\r
-          beepshort();\r
-        }\r
-      }break;\r
+      MENUITEM(  lcdprintPGM(" File")  ,  BLOCK;status=Main_Menu;beepshort(); ) ;\r
+      break;\r
     case 1:\r
       {\r
         if(force_lcd_update)\r
@@ -1272,93 +1148,33 @@ void MainMenu::showSD()
   }\r
   line++;\r
  }\r
- lastlineoffset=lineoffset;\r
- if((encoderpos!=lastencoderpos)||force_lcd_update)\r
- {\r
-   \r
-    lcd.setCursor(0,activeline);lcd.print((activeline+lineoffset)?' ':' ');\r
-    \r
-    if(encoderpos<0)\r
-    {\r
-     lineoffset--;\r
-     if(lineoffset<0)\r
-       lineoffset=0;\r
-     encoderpos=0;\r
-     force_lcd_update=true;\r
-    }\r
-    if(encoderpos/lcdslow>3)\r
-    {\r
-     lineoffset++;\r
-     encoderpos=3*lcdslow;\r
-     if(lineoffset>(1+nrfiles+1-LCD_HEIGHT))\r
-       lineoffset=1+nrfiles+1-LCD_HEIGHT;\r
-     force_lcd_update=true;\r
-     \r
-    }\r
-    lastencoderpos=encoderpos;\r
-    activeline=encoderpos;\r
-    if(activeline>3) \r
-    {\r
-      activeline=3;\r
-    }\r
-    if(activeline<0) \r
-    {\r
-      activeline=0;\r
-    }\r
-    if(activeline>1+nrfiles) activeline=1+nrfiles;\r
-    if(lineoffset>1+nrfiles) lineoffset=1+nrfiles;\r
-    lcd.setCursor(0,activeline);lcd.print((activeline+lineoffset)?'>':'\003');   \r
-    \r
-  }\r
+ updateActiveLines(1+nrfiles,encoderpos);\r
 #endif\r
 }\r
 \r
 enum {ItemM_watch, ItemM_prepare, ItemM_control, ItemM_file };\r
 void MainMenu::showMainMenu()\r
 {\r
-   //if(int(encoderpos/lcdslow)!=int(lastencoderpos/lcdslow))\r
-   //  force_lcd_update=true;\r
+\r
   #ifndef ULTIPANEL\r
     force_lcd_update=false;\r
   #endif\r
-   //Serial.println((int)activeline);\r
-   if(force_lcd_update)\r
-     clear();\r
+   \r
+  clearIfNecessary();\r
   for(int8_t line=0;line<LCD_HEIGHT;line++)\r
   {\r
     switch(line)\r
     { \r
       case ItemM_watch:\r
-      {\r
-        if(force_lcd_update) {lcd.setCursor(0,line);lcdprintPGM(" Watch   \x7E");}\r
-        if((activeline==line)&&CLICKED)\r
-        {\r
-          BLOCK;\r
-          beepshort();\r
-          status=Main_Status;\r
-        }\r
-      } break;\r
+        MENUITEM(  lcdprintPGM(" Watch")  ,  BLOCK;status=Main_Status;beepshort(); ) ;\r
+       break;\r
       case ItemM_prepare:\r
-      {\r
-        if(force_lcd_update) {lcd.setCursor(0,line);lcdprintPGM(" Prepare \x7E");}\r
-        if((activeline==line)&&CLICKED)\r
-        {\r
-          BLOCK;\r
-          status=Main_Prepare;\r
-          beepshort();\r
-        }\r
-      } break;\r
+        MENUITEM(  lcdprintPGM(" Prepare \x7E")  ,  BLOCK;status=Main_Prepare;beepshort(); ) ;\r
+      break;\r
        \r
       case ItemM_control:\r
-      {\r
-        if(force_lcd_update) {lcd.setCursor(0,line);lcdprintPGM(" Control \x7E");}\r
-        if((activeline==line)&&CLICKED)\r
-        {\r
-          BLOCK;\r
-          status=Main_Control;\r
-          beepshort();\r
-        }\r
-      }break;\r
+        MENUITEM(  lcdprintPGM(" Control \x7E")  ,  BLOCK;status=Main_Control;beepshort(); ) ;\r
+      break;\r
       #ifdef SDSUPPORT\r
       case ItemM_file:    \r
       {\r
@@ -1392,6 +1208,9 @@ void MainMenu::showMainMenu()
           beepshort();\r
         }\r
       }break;\r
+      #else\r
+      case ItemM_file:\r
+        break;\r
       #endif\r
       default: \r
         SERIAL_ERROR_START;\r
@@ -1399,24 +1218,7 @@ void MainMenu::showMainMenu()
       break;\r
     }\r
   }\r
-  if(activeline<0) \r
-    activeline=0;\r
-  if(activeline>=LCD_HEIGHT) \r
-    activeline=LCD_HEIGHT-1;\r
-  if((encoderpos!=lastencoderpos)||force_lcd_update)\r
-  {\r
-    lcd.setCursor(0,activeline);lcd.print(activeline?' ':' ');\r
-    if(encoderpos<0) encoderpos=0;\r
-    if(encoderpos>3*lcdslow) \r
-      encoderpos=3*lcdslow;\r
-    activeline=abs(encoderpos/lcdslow)%LCD_HEIGHT;\r
-    if(activeline<0) \r
-      activeline=0;\r
-    if(activeline>=LCD_HEIGHT) \r
-      activeline=LCD_HEIGHT-1;\r
-    lastencoderpos=encoderpos;\r
-    lcd.setCursor(0,activeline);lcd.print(activeline?'>':'\003');\r
-  }\r
+  updateActiveLines(3,encoderpos);\r
 }\r
 \r
 void MainMenu::update()\r
@@ -1433,20 +1235,18 @@ void MainMenu::update()
       if(CARDINSERTED)\r
       {\r
         card.initsd();\r
-        lcd_status("Card inserted");\r
+        LCD_MESSAGEPGM("Card inserted");\r
       }\r
       else\r
       {\r
         card.release();\r
-        lcd_status("Card removed");\r
+        LCD_MESSAGEPGM("Card removed");\r
       }\r
     }\r
   #endif\r
  \r
   if(status!=oldstatus)\r
   {\r
-    //Serial.println(status);\r
-    //clear();\r
     force_lcd_update=true;\r
     encoderpos=0;\r
     lineoffset=0;\r