Browse Source

Add Laser / Spindle bitmap for LCD (#16068)

Luu Lac 5 years ago
parent
commit
01e4b0c067

+ 1
- 0
Marlin/src/feature/spindle_laser.h View File

46
 class SpindleLaser {
46
 class SpindleLaser {
47
 public:
47
 public:
48
   static cutter_power_t power;
48
   static cutter_power_t power;
49
+  static inline uint8_t powerPercent(const uint8_t pp) { return ui8_to_percent(pp); } // for display
49
 
50
 
50
   static void init();
51
   static void init();
51
 
52
 

+ 144
- 0
Marlin/src/lcd/dogm/dogm_Statusscreen.h View File

598
 
598
 
599
 #endif // !STATUS_HEATERS_WIDTH && !STATUS_HOTEND1_WIDTH
599
 #endif // !STATUS_HEATERS_WIDTH && !STATUS_HOTEND1_WIDTH
600
 
600
 
601
+// LASER / SPINDLE
602
+#if !STATUS_CUTTER_WIDTH && HAS_CUTTER
603
+  #define STATUS_CUTTER_WIDTH 24
604
+  #define STATUS_CUTTER_X 80
605
+  #if ENABLED(LASER_FEATURE)
606
+    #ifdef STATUS_CUTTER_ANIM
607
+      const unsigned char status_cutter_on_bmp[] PROGMEM = {
608
+        B00000000,B00100100,B00000000,
609
+        B00000000,B01100110,B00000000,
610
+        B00000000,B11000011,B00000000,
611
+        B00000001,B10011001,B10000000,
612
+        B00000011,B00100100,B11000000,
613
+        B00000000,B01000010,B00000000,
614
+        B00000000,B01000010,B00000000,
615
+        B00000011,B00100100,B11000000,
616
+        B00000001,B10011001,B10000000,
617
+        B00000000,B11000011,B00000000,
618
+        B00000000,B01100110,B00000000,
619
+        B00000000,B00100100,B00000000
620
+      };
621
+      const unsigned char status_cutter_bmp[] PROGMEM = {
622
+        B00000000,B00100100,B00000000,
623
+        B00000000,B01100110,B00000000,
624
+        B00000000,B00000000,B00000000,
625
+        B00000001,B00000000,B10000000,
626
+        B00000011,B00000000,B11000000,
627
+        B00000000,B00011000,B00000000,
628
+        B00000000,B00011000,B00000000,
629
+        B00000011,B00000000,B11000000,
630
+        B00000001,B00000000,B10000000,
631
+        B00000000,B00000000,B00000000,
632
+        B00000000,B01100110,B00000000,
633
+        B00000000,B00100100,B00000000
634
+      };
635
+    #else
636
+      const unsigned char status_cutter_bmp[] PROGMEM = {
637
+        B00000000,B00100100,B00000000,
638
+        B00000000,B01100110,B00000000,
639
+        B00000000,B11000011,B00000000,
640
+        B00000001,B10000001,B10000000,
641
+        B00000011,B00000000,B11000000,
642
+        B00000000,B00000000,B00000000,
643
+        B00000000,B00000000,B00000000,
644
+        B00000011,B00000000,B11000000,
645
+        B00000001,B10000001,B10000000,
646
+        B00000000,B11000011,B00000000,
647
+        B00000000,B01100110,B00000000,
648
+        B00000000,B00100100,B00000000
649
+      };
650
+    #endif
651
+  #else
652
+    #ifdef STATUS_CUTTER_ANIM
653
+      const unsigned char status_cutter_on_bmp[] PROGMEM = {
654
+        B00000001,B11111110,B10000000,
655
+        B00000000,B11000000,B00000000,
656
+        B00000001,B10000000,B10000000,
657
+        B00000001,B00000000,B10000000,
658
+        B00000001,B11111100,B10000000,
659
+        B00000000,B11100000,B00000000,
660
+        B00000001,B11000000,B10000000,
661
+        B00000000,B10000001,B00000000,
662
+        B00000000,B01111010,B00000000,
663
+        B00000000,B00110100,B00000000,
664
+        B00000000,B00011000,B00000000,
665
+        B00000000,B00000000,B00000000
666
+      };
667
+      const unsigned char status_cutter_bmp[] PROGMEM = {
668
+        B00000001,B11111110,B10000000,
669
+        B00000000,B11000000,B00000000,
670
+        B00000001,B10000000,B10000000,
671
+        B00000001,B00000000,B10000000,
672
+        B00000001,B11111100,B10000000,
673
+        B00000000,B11100000,B00000000,
674
+        B00000001,B11000000,B10000000,
675
+        B00000000,B10000001,B00000000,
676
+        B00000000,B01111010,B00000000,
677
+        B00000000,B00110100,B00000000,
678
+        B00000000,B00011000,B00000000,
679
+        B00000000,B00000000,B00000000
680
+      };
681
+    #else
682
+      const unsigned char status_cutter_bmp[] PROGMEM = {
683
+        B00000001,B11000010,B10000000,
684
+        B00000001,B00011100,B10000000,
685
+        B00000000,B11100001,B00000000,
686
+        B00000001,B00001110,B10000000,
687
+        B00000001,B01110000,B10000000,
688
+        B00000000,B10000111,B10000000,
689
+        B00000001,B00111111,B10000000,
690
+        B00000000,B11111111,B00000000,
691
+        B00000000,B01111110,B00000000,
692
+        B00000000,B00111100,B00000000,
693
+        B00000000,B00011000,B00000000,
694
+        B00000000,B00000000,B00000000
695
+      };
696
+    #endif
697
+  #endif
698
+#endif // LASER / SPINDLE
699
+
601
 //
700
 //
602
 // Default Status Screen Bed bitmaps
701
 // Default Status Screen Bed bitmaps
603
 //
702
 //
1468
 #endif
1567
 #endif
1469
 
1568
 
1470
 //
1569
 //
1570
+// Cutter Bitmap Properties
1571
+//
1572
+#ifndef STATUS_CUTTER_BYTEWIDTH
1573
+  #define STATUS_CUTTER_BYTEWIDTH BW(STATUS_CUTTER_WIDTH)
1574
+#endif
1575
+#if STATUS_CUTTER_WIDTH
1576
+
1577
+  #ifndef STATUS_CUTTER_X
1578
+    #define STATUS_CUTTER_X (LCD_PIXEL_WIDTH - (STATUS_CUTTER_BYTEWIDTH + STATUS_CUTTER_BYTEWIDTH) * 8)
1579
+  #endif
1580
+
1581
+  #ifndef STATUS_CUTTER_HEIGHT
1582
+    #ifdef STATUS_CUTTER_ANIM
1583
+      #define STATUS_CUTTER_HEIGHT(S) ((S) ? sizeof(status_cutter_on_bmp) / (STATUS_CUTTER_BYTEWIDTH) : sizeof(status_cutter_bmp) / (STATUS_CUTTER_BYTEWIDTH))
1584
+    #else
1585
+      #define STATUS_CUTTER_HEIGHT(S) (sizeof(status_cutter_bmp) / (STATUS_CUTTER_BYTEWIDTH))
1586
+    #endif
1587
+  #endif
1588
+
1589
+  #ifndef STATUS_CUTTER_Y
1590
+    #define STATUS_CUTTER_Y(S) 4
1591
+  #endif
1592
+
1593
+  #ifndef STATUS_CUTTER_TEXT_X
1594
+    #define STATUS_CUTTER_TEXT_X (STATUS_CUTTER_X -1)
1595
+  #endif
1596
+
1597
+  #ifndef STATUS_CUTTER_TEXT_Y
1598
+    #define STATUS_CUTTER_TEXT_Y 28
1599
+  #endif
1600
+
1601
+  static_assert(
1602
+    sizeof(status_cutter_bmp) == (STATUS_CUTTER_BYTEWIDTH) * (STATUS_CUTTER_HEIGHT(0)),
1603
+    "Status cutter bitmap (status_cutter_bmp) dimensions don't match data."
1604
+  );
1605
+  #ifdef STATUS_CUTTER_ANIM
1606
+    static_assert(
1607
+      sizeof(status_cutter_on_bmp) == (STATUS_CUTTER_BYTEWIDTH) * (STATUS_CUTTER_HEIGHT(1)),
1608
+      "Status cutter bitmap (status_cutter_on_bmp) dimensions don't match data."
1609
+    );
1610
+  #endif
1611
+
1612
+#endif
1613
+
1614
+//
1471
 // Chamber Bitmap Properties
1615
 // Chamber Bitmap Properties
1472
 //
1616
 //
1473
 #ifndef STATUS_CHAMBER_BYTEWIDTH
1617
 #ifndef STATUS_CHAMBER_BYTEWIDTH

+ 63
- 23
Marlin/src/lcd/dogm/status_screen_DOGM.cpp View File

44
   #include "../../gcode/parser.h"
44
   #include "../../gcode/parser.h"
45
 #endif
45
 #endif
46
 
46
 
47
+#if HAS_CUTTER
48
+  #include "../../feature/spindle_laser.h"
49
+#endif
50
+
47
 #if ENABLED(SDSUPPORT)
51
 #if ENABLED(SDSUPPORT)
48
   #include "../../sd/cardreader.h"
52
   #include "../../sd/cardreader.h"
49
 #endif
53
 #endif
65
 
69
 
66
 #define DO_DRAW_LOGO (STATUS_LOGO_WIDTH && ENABLED(CUSTOM_STATUS_SCREEN_IMAGE))
70
 #define DO_DRAW_LOGO (STATUS_LOGO_WIDTH && ENABLED(CUSTOM_STATUS_SCREEN_IMAGE))
67
 #define DO_DRAW_HOTENDS (HOTENDS > 0)
71
 #define DO_DRAW_HOTENDS (HOTENDS > 0)
72
+#define DO_DRAW_CUTTER (HAS_CUTTER)
68
 #define DO_DRAW_BED (HAS_HEATED_BED && STATUS_BED_WIDTH && HOTENDS <= 4)
73
 #define DO_DRAW_BED (HAS_HEATED_BED && STATUS_BED_WIDTH && HOTENDS <= 4)
69
 #define DO_DRAW_CHAMBER (HAS_TEMP_CHAMBER && STATUS_CHAMBER_WIDTH && HOTENDS <= 4)
74
 #define DO_DRAW_CHAMBER (HAS_TEMP_CHAMBER && STATUS_CHAMBER_WIDTH && HOTENDS <= 4)
70
 #define DO_DRAW_FAN (HAS_FAN0 && STATUS_FAN_WIDTH && HOTENDS <= 4 && defined(STATUS_FAN_FRAMES))
75
 #define DO_DRAW_FAN (HAS_FAN0 && STATUS_FAN_WIDTH && HOTENDS <= 4 && defined(STATUS_FAN_FRAMES))
72
 #define ANIM_HOTEND (HOTENDS && ENABLED(STATUS_HOTEND_ANIM))
77
 #define ANIM_HOTEND (HOTENDS && ENABLED(STATUS_HOTEND_ANIM))
73
 #define ANIM_BED (DO_DRAW_BED && ENABLED(STATUS_BED_ANIM))
78
 #define ANIM_BED (DO_DRAW_BED && ENABLED(STATUS_BED_ANIM))
74
 #define ANIM_CHAMBER (DO_DRAW_CHAMBER && ENABLED(STATUS_CHAMBER_ANIM))
79
 #define ANIM_CHAMBER (DO_DRAW_CHAMBER && ENABLED(STATUS_CHAMBER_ANIM))
75
-
76
-#define ANIM_HBC (ANIM_HOTEND || ANIM_BED || ANIM_CHAMBER)
77
-
78
-#if ANIM_HBC
79
-  uint8_t heat_bits;
80
+#define ANIM_CUTTER (DO_DRAW_CUTTER && ENABLED(STATUS_CUTTER_ANIM))
81
+
82
+#define ANIM_HBCC (ANIM_HOTEND || ANIM_BED || ANIM_CHAMBER || ANIM_CUTTER)
83
+
84
+#if ANIM_HBCC
85
+  enum HeatBits : uint8_t {
86
+    HEATBIT_HOTEND,
87
+    HEATBIT_BED = HOTENDS,
88
+    HEATBIT_CHAMBER,
89
+    HEATBIT_CUTTER
90
+  };
91
+  IF<(HEATBIT_CUTTER > 7), uint16_t, uint8_t>::type heat_bits;
80
 #endif
92
 #endif
81
 #if ANIM_HOTEND
93
 #if ANIM_HOTEND
82
-  #define HOTEND_ALT(N) TEST(heat_bits, N)
94
+  #define HOTEND_ALT(N) TEST(heat_bits, HEATBIT_HOTEND + N)
83
 #else
95
 #else
84
   #define HOTEND_ALT(N) false
96
   #define HOTEND_ALT(N) false
85
 #endif
97
 #endif
86
 #if ANIM_BED
98
 #if ANIM_BED
87
-  #define BED_ALT() TEST(heat_bits, 7)
99
+  #define BED_ALT() TEST(heat_bits, HEATBIT_BED)
88
 #else
100
 #else
89
   #define BED_ALT() false
101
   #define BED_ALT() false
90
 #endif
102
 #endif
91
 #if ANIM_CHAMBER
103
 #if ANIM_CHAMBER
92
-  #define CHAMBER_ALT() TEST(heat_bits, 6)
104
+  #define CHAMBER_ALT() TEST(heat_bits, HEATBIT_CHAMBER)
93
 #else
105
 #else
94
   #define CHAMBER_ALT() false
106
   #define CHAMBER_ALT() false
95
 #endif
107
 #endif
108
+#if ANIM_CUTTER
109
+  #define CUTTER_ALT(N) TEST(heat_bits, HEATBIT_CUTTER)
110
+#else
111
+  #define CUTTER_ALT() false
112
+#endif
96
 
113
 
97
-#if HOTENDS
114
+#if DO_DRAW_HOTENDS
98
   #define MAX_HOTEND_DRAW _MIN(HOTENDS, ((LCD_PIXEL_WIDTH - (STATUS_LOGO_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) / (STATUS_HEATERS_XSPACE)))
115
   #define MAX_HOTEND_DRAW _MIN(HOTENDS, ((LCD_PIXEL_WIDTH - (STATUS_LOGO_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) / (STATUS_HEATERS_XSPACE)))
116
+  #define STATUS_HEATERS_BOT (STATUS_HEATERS_Y + STATUS_HEATERS_HEIGHT - 1)
99
 #endif
117
 #endif
100
 
118
 
101
-#define STATUS_HEATERS_BOT (STATUS_HEATERS_Y + STATUS_HEATERS_HEIGHT - 1)
102
-
103
 #define PROGRESS_BAR_X 54
119
 #define PROGRESS_BAR_X 54
104
 #define PROGRESS_BAR_WIDTH (LCD_PIXEL_WIDTH - PROGRESS_BAR_X)
120
 #define PROGRESS_BAR_WIDTH (LCD_PIXEL_WIDTH - PROGRESS_BAR_X)
105
 
121
 
112
 
128
 
113
 #if DO_DRAW_HOTENDS
129
 #if DO_DRAW_HOTENDS
114
 
130
 
131
+  // Draw hotend bitmap with current and target temperatures
115
   FORCE_INLINE void _draw_hotend_status(const heater_ind_t heater, const bool blink) {
132
   FORCE_INLINE void _draw_hotend_status(const heater_ind_t heater, const bool blink) {
116
     #if !HEATER_IDLE_HANDLER
133
     #if !HEATER_IDLE_HANDLER
117
       UNUSED(blink);
134
       UNUSED(blink);
203
 
220
 
204
     if (PAGE_UNDER(7)) {
221
     if (PAGE_UNDER(7)) {
205
       #if HEATER_IDLE_HANDLER
222
       #if HEATER_IDLE_HANDLER
206
-        const bool is_idle = thermalManager.hotend_idle[heater].timed_out,
207
-                   dodraw = (blink || !is_idle);
223
+        const bool dodraw = (blink || !thermalManager.hotend_idle[heater].timed_out);
208
       #else
224
       #else
209
         constexpr bool dodraw = true;
225
         constexpr bool dodraw = true;
210
       #endif
226
       #endif
222
 
238
 
223
   }
239
   }
224
 
240
 
225
-#endif // HOTENDS
241
+#endif // DO_DRAW_HOTENDS
226
 
242
 
227
 #if DO_DRAW_BED
243
 #if DO_DRAW_BED
228
 
244
 
245
+  // Draw bed bitmap with current and target temperatures
229
   FORCE_INLINE void _draw_bed_status(const bool blink) {
246
   FORCE_INLINE void _draw_bed_status(const bool blink) {
230
     #if !HEATER_IDLE_HANDLER
247
     #if !HEATER_IDLE_HANDLER
231
       UNUSED(blink);
248
       UNUSED(blink);
274
 
291
 
275
     if (PAGE_UNDER(7)) {
292
     if (PAGE_UNDER(7)) {
276
       #if HEATER_IDLE_HANDLER
293
       #if HEATER_IDLE_HANDLER
277
-        const bool is_idle = thermalManager.bed_idle.timed_out,
278
-                   dodraw = (blink || !is_idle);
294
+        const bool dodraw = (blink || !thermalManager.bed_idle.timed_out);
279
       #else
295
       #else
280
         constexpr bool dodraw = true;
296
         constexpr bool dodraw = true;
281
       #endif
297
       #endif
383
 
399
 
384
   // At the first page, generate new display values
400
   // At the first page, generate new display values
385
   if (first_page) {
401
   if (first_page) {
386
-    #if ANIM_HBC
402
+    #if ANIM_HBCC
387
       uint8_t new_bits = 0;
403
       uint8_t new_bits = 0;
388
       #if ANIM_HOTEND
404
       #if ANIM_HOTEND
389
-        HOTEND_LOOP() if (thermalManager.isHeatingHotend(e)) SBI(new_bits, e);
405
+        HOTEND_LOOP() if (thermalManager.isHeatingHotend(e)) SBI(new_bits, HEATBIT_HOTEND + e);
390
       #endif
406
       #endif
391
       #if ANIM_BED
407
       #if ANIM_BED
392
-        if (thermalManager.isHeatingBed()) SBI(new_bits, 7);
408
+        if (thermalManager.isHeatingBed()) SBI(new_bits, HEATBIT_BED);
393
       #endif
409
       #endif
394
       #if DO_DRAW_CHAMBER && HAS_HEATED_CHAMBER
410
       #if DO_DRAW_CHAMBER && HAS_HEATED_CHAMBER
395
-        if (thermalManager.isHeatingChamber()) SBI(new_bits, 6);
411
+        if (thermalManager.isHeatingChamber()) SBI(new_bits, HEATBIT_CHAMBER);
412
+      #endif
413
+      #if ANIM_CUTTER
414
+        if (cutter.enabled()) SBI(new_bits, HEATBIT_CUTTER);
396
       #endif
415
       #endif
397
       heat_bits = new_bits;
416
       heat_bits = new_bits;
398
     #endif
417
     #endif
505
       u8g.drawBitmapP(STATUS_HEATERS_X, STATUS_HEATERS_Y, STATUS_HEATERS_BYTEWIDTH, STATUS_HEATERS_HEIGHT, status_heaters_bmp);
524
       u8g.drawBitmapP(STATUS_HEATERS_X, STATUS_HEATERS_Y, STATUS_HEATERS_BYTEWIDTH, STATUS_HEATERS_HEIGHT, status_heaters_bmp);
506
   #endif
525
   #endif
507
 
526
 
527
+  #if DO_DRAW_CUTTER
528
+    #if ANIM_CUTTER
529
+      #define CUTTER_BITMAP(S) ((S) ? status_cutter_on_bmp : status_cutter_bmp)
530
+    #else
531
+      #define CUTTER_BITMAP(S) status_cutter_bmp
532
+    #endif
533
+    const uint8_t cuttery = STATUS_CUTTER_Y(CUTTER_ALT()),
534
+                  cutterh = STATUS_CUTTER_HEIGHT(CUTTER_ALT());
535
+    if (PAGE_CONTAINS(cuttery, cuttery + cutterh - 1))
536
+      u8g.drawBitmapP(STATUS_CUTTER_X, cuttery, STATUS_CUTTER_BYTEWIDTH, cutterh, CUTTER_BITMAP(CUTTER_ALT()));
537
+  #endif
538
+
508
   #if DO_DRAW_BED && DISABLED(STATUS_COMBINE_HEATERS)
539
   #if DO_DRAW_BED && DISABLED(STATUS_COMBINE_HEATERS)
509
     #if ANIM_BED
540
     #if ANIM_BED
510
       #define BED_BITMAP(S) ((S) ? status_bed_on_bmp : status_bed_bmp)
541
       #define BED_BITMAP(S) ((S) ? status_bed_on_bmp : status_bed_bmp)
558
   //
589
   //
559
   if (PAGE_UNDER(6 + 1 + 12 + 1 + 6 + 1)) {
590
   if (PAGE_UNDER(6 + 1 + 12 + 1 + 6 + 1)) {
560
     // Extruders
591
     // Extruders
561
-    #if HOTENDS
592
+    #if DO_DRAW_HOTENDS
562
       for (uint8_t e = 0; e < MAX_HOTEND_DRAW; ++e)
593
       for (uint8_t e = 0; e < MAX_HOTEND_DRAW; ++e)
563
         _draw_hotend_status((heater_ind_t)e, blink);
594
         _draw_hotend_status((heater_ind_t)e, blink);
564
     #endif
595
     #endif
565
 
596
 
566
-    // Heated bed
567
-    #if DO_DRAW_BED && DISABLED(STATUS_COMBINE_HEATERS) || (HAS_HEATED_BED && ENABLED(STATUS_COMBINE_HEATERS) && HOTENDS <= 4)
597
+    // Laser / Spindle
598
+    #if DO_DRAW_CUTTER
599
+      if (cutter.power && PAGE_CONTAINS(STATUS_CUTTER_TEXT_Y - INFO_FONT_ASCENT, STATUS_CUTTER_TEXT_Y - 1)) {
600
+        lcd_put_u8str(STATUS_CUTTER_TEXT_X, STATUS_CUTTER_TEXT_Y, i16tostr3(cutter.powerPercent(cutter.power)));
601
+        lcd_put_wchar('%');
602
+      }
603
+    #endif
604
+
605
+    // Heated Bed
606
+    #if DO_DRAW_BED
568
       _draw_bed_status(blink);
607
       _draw_bed_status(blink);
569
     #endif
608
     #endif
570
 
609
 
610
+    // Heated Chamber
571
     #if DO_DRAW_CHAMBER
611
     #if DO_DRAW_CHAMBER
572
       _draw_chamber_status();
612
       _draw_chamber_status();
573
     #endif
613
     #endif

Loading…
Cancel
Save