lcd.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. //! @file
  2. #ifndef _LCD_H
  3. #define _LCD_H
  4. #include <inttypes.h>
  5. #include <stdio.h>
  6. #include "Timer.h"
  7. extern FILE _lcdout;
  8. #define lcdout (&_lcdout)
  9. extern int lcd_putchar(char c, FILE *stream);
  10. extern void lcd_init(void);
  11. extern void lcd_refresh(void);
  12. extern void lcd_refresh_noclear(void);
  13. extern void lcd_clear(void);
  14. extern void lcd_home(void);
  15. /*extern void lcd_no_display(void);
  16. extern void lcd_display(void);
  17. extern void lcd_no_blink(void);
  18. extern void lcd_blink(void);
  19. extern void lcd_no_cursor(void);
  20. extern void lcd_cursor(void);
  21. extern void lcd_scrollDisplayLeft(void);
  22. extern void lcd_scrollDisplayRight(void);
  23. extern void lcd_leftToRight(void);
  24. extern void lcd_rightToLeft(void);
  25. extern void lcd_autoscroll(void);
  26. extern void lcd_no_autoscroll(void);*/
  27. extern void lcd_set_cursor(uint8_t col, uint8_t row);
  28. extern void lcd_createChar_P(uint8_t, const uint8_t*);
  29. extern int lcd_putc(int c);
  30. extern int lcd_puts_P(const char* str);
  31. extern int lcd_puts_at_P(uint8_t c, uint8_t r, const char* str);
  32. extern int lcd_printf_P(const char* format, ...);
  33. extern void lcd_space(uint8_t n);
  34. extern void lcd_printNumber(unsigned long n, uint8_t base);
  35. extern void lcd_printFloat(double number, uint8_t digits);
  36. extern void lcd_print(const char*);
  37. extern void lcd_print(char, int = 0);
  38. extern void lcd_print(unsigned char, int = 0);
  39. extern void lcd_print(int, int = 10);
  40. extern void lcd_print(unsigned int, int = 10);
  41. extern void lcd_print(long, int = 10);
  42. extern void lcd_print(unsigned long, int = 10);
  43. extern void lcd_print(double, int = 2);
  44. #define ESC_2J "\x1b[2J"
  45. #define ESC_25h "\x1b[?25h"
  46. #define ESC_25l "\x1b[?25l"
  47. #define ESC_H(c,r) "\x1b["#r";"#c"H"
  48. #define LCD_UPDATE_INTERVAL 100
  49. #define LCD_TIMEOUT_TO_STATUS 30000ul //!< Generic timeout to status screen in ms, when no user action.
  50. #define LCD_TIMEOUT_TO_STATUS_BABYSTEP_Z 90000ul //!< Specific timeout for lcd_babystep_z screen in ms.
  51. typedef void (*lcd_longpress_func_t)(void);
  52. typedef void (*lcd_charsetup_func_t)(void);
  53. typedef void (*lcd_lcdupdate_func_t)(void);
  54. //Set to none-zero when the LCD needs to draw, decreased after every draw. Set to 2 in LCD routines so the LCD gets at least 1 full redraw (first redraw is partial)
  55. extern uint8_t lcd_draw_update;
  56. extern int32_t lcd_encoder;
  57. extern uint8_t lcd_encoder_bits;
  58. // lcd_encoder_diff is updated from interrupt context and added to lcd_encoder every LCD update
  59. extern int8_t lcd_encoder_diff;
  60. //the last checked lcd_buttons in a bit array.
  61. extern uint8_t lcd_buttons;
  62. extern uint8_t lcd_button_pressed;
  63. extern uint8_t lcd_update_enabled;
  64. extern LongTimer lcd_timeoutToStatus;
  65. extern uint32_t lcd_next_update_millis;
  66. extern uint8_t lcd_status_update_delay;
  67. extern lcd_longpress_func_t lcd_longpress_func;
  68. extern lcd_charsetup_func_t lcd_charsetup_func;
  69. extern lcd_lcdupdate_func_t lcd_lcdupdate_func;
  70. extern uint8_t lcd_clicked(void);
  71. extern void lcd_beeper_quick_feedback(void);
  72. //Cause an LCD refresh, and give the user visual or audible feedback that something has happened
  73. extern void lcd_quick_feedback(void);
  74. extern void lcd_update(uint8_t lcdDrawUpdateOverride);
  75. extern void lcd_update_enable(uint8_t enabled);
  76. extern void lcd_buttons_update(void);
  77. //! @brief Helper class to temporarily disable LCD updates
  78. //!
  79. //! When constructed (on stack), original state state of lcd_update_enabled is stored
  80. //! and LCD updates are disabled.
  81. //! When destroyed (gone out of scope), original state of LCD update is restored.
  82. //! It has zero overhead compared to storing bool saved = lcd_update_enabled
  83. //! and calling lcd_update_enable(false) and lcd_update_enable(saved).
  84. class LcdUpdateDisabler
  85. {
  86. public:
  87. LcdUpdateDisabler(): m_updateEnabled(lcd_update_enabled)
  88. {
  89. lcd_update_enable(false);
  90. }
  91. ~LcdUpdateDisabler()
  92. {
  93. lcd_update_enable(m_updateEnabled);
  94. }
  95. private:
  96. bool m_updateEnabled;
  97. };
  98. /**
  99. * Implementation of the LCD display routines for a Hitachi HD44780 display. These are common LCD character displays.
  100. * When selecting the Russian language, a slightly different LCD implementation is used to handle UTF8 characters.
  101. **/
  102. ////////////////////////////////////
  103. // Setup button and encode mappings for each panel (into 'lcd_buttons' variable
  104. //
  105. // This is just to map common functions (across different panels) onto the same
  106. // macro name. The mapping is independent of whether the button is directly connected or
  107. // via a shift/i2c register.
  108. #define BLEN_B 1
  109. #define BLEN_A 0
  110. #define EN_B (1<<BLEN_B) // The two encoder pins are connected through BTN_EN1 and BTN_EN2
  111. #define EN_A (1<<BLEN_A)
  112. #define BLEN_C 2
  113. #define EN_C (1<<BLEN_C)
  114. //! @brief Was button clicked?
  115. //!
  116. //! Doesn't consume button click event. See lcd_clicked()
  117. //! for function consuming the event.
  118. //!
  119. //! Generally is used in non-modal menus.
  120. //!
  121. //! @retval 0 button was not clicked
  122. //! @retval 1 button was clicked
  123. #define LCD_CLICKED (lcd_buttons&EN_C)
  124. ////////////////////////
  125. // Setup Rotary Encoder Bit Values (for two pin encoders to indicate movement)
  126. // These values are independent of which pins are used for EN_A and EN_B indications
  127. // The rotary encoder part is also independent to the chipset used for the LCD
  128. #define encrot0 0
  129. #define encrot1 2
  130. #define encrot2 3
  131. #define encrot3 1
  132. //Custom characters defined in the first 8 characters of the LCD
  133. #define LCD_STR_BEDTEMP "\x00"
  134. #define LCD_STR_DEGREE "\x01"
  135. #define LCD_STR_THERMOMETER "\x02"
  136. #define LCD_STR_UPLEVEL "\x03"
  137. #define LCD_STR_REFRESH "\x04"
  138. #define LCD_STR_FOLDER "\x05"
  139. #define LCD_STR_FEEDRATE "\x06"
  140. #define LCD_STR_CLOCK "\x07"
  141. #define LCD_STR_ARROW_UP "\x0B"
  142. #define LCD_STR_ARROW_DOWN "\x01"
  143. #define LCD_STR_ARROW_RIGHT "\x7E" //from the default character set
  144. extern void lcd_set_custom_characters(void);
  145. extern void lcd_set_custom_characters_arrows(void);
  146. extern void lcd_set_custom_characters_progress(void);
  147. extern void lcd_set_custom_characters_nextpage(void);
  148. extern void lcd_set_custom_characters_degree(void);
  149. //! @brief Consume click event
  150. inline void lcd_consume_click()
  151. {
  152. lcd_button_pressed = 0;
  153. lcd_buttons &= 0xff^EN_C;
  154. }
  155. #endif //_LCD_H