@ -1,19 +1,20 @@
/**
/**
* dogm_lcd_implementation . h
* dogm_lcd_implementation . h
*
*
* Graphics LCD implementation for 128 x64 pixel LCDs by STB for ErikZalm / Marlin
* Graphics LCD implementation for 128 x64 pixel LCDs by STB for ErikZalm / Marlin
* Demonstrator : http : //www.reprap.org/wiki/STB_Electronics
* Demonstrator : http : //www.reprap.org/wiki/STB_Electronics
* License : http : //opensource.org/licenses/BSD-3-Clause
* License : http : //opensource.org/licenses/BSD-3-Clause
*
*
* With the use of :
* With the use of :
* u8glib by Oliver Kraus
* u8glib by Oliver Kraus
* http : //code.google.com/p/u8glib/
* http : //code.google.com/p/u8glib/
* License : http : //opensource.org/licenses/BSD-3-Clause
* License : http : //opensource.org/licenses/BSD-3-Clause
*/
*/
# ifndef DOGM_LCD_IMPLEMENTATION_H
# define DOGM_LCD_IMPLEMENTATION_H
# ifndef ULTRA_LCD_IMPLEMENTATION_DOGM_H
# define MARLIN_VERSION "1.0.2"
# define ULTRA_LCD_IMPLEMENTATION_DOGM_H
/**
/**
* Implementation of the LCD display routines for a DOGM128 graphic display . These are common LCD 128 x64 pixel graphic displays .
* Implementation of the LCD display routines for a DOGM128 graphic display . These are common LCD 128 x64 pixel graphic displays .
@ -85,17 +86,21 @@ U8GLIB_NHD_C12864 u8g(DOGLCD_CS, DOGLCD_A0);
U8GLIB_DOGM128 u8g ( DOGLCD_CS , DOGLCD_A0 ) ; // HW-SPI Com: CS, A0
U8GLIB_DOGM128 u8g ( DOGLCD_CS , DOGLCD_A0 ) ; // HW-SPI Com: CS, A0
# endif
# endif
static void lcd_implementation_init ( )
static void lcd_implementation_init ( ) {
{
# ifdef LCD_PIN_BL
# ifdef LCD_PIN_BL
pinMode ( LCD_PIN_BL , OUTPUT ) ; // Enable LCD backlight
pinMode ( LCD_PIN_BL , OUTPUT ) ; // Enable LCD backlight
digitalWrite ( LCD_PIN_BL , HIGH ) ;
digitalWrite ( LCD_PIN_BL , HIGH ) ;
# endif
# endif
u8g . setContrast ( lcd_contrast ) ;
u8g . setContrast ( lcd_contrast ) ;
/*
// Uncomment this if you have the first generation (V1.10) of STBs board
// Uncomment this if you have the first generation (V1.10) of STBs board
// pinMode(17, OUTPUT); // Enable LCD backlight
// digitalWrite(17, HIGH);
pinMode ( 17 , OUTPUT ) ; // Enable LCD backlight
digitalWrite ( 17 , HIGH ) ;
//*/
u8g . firstPage ( ) ;
u8g . firstPage ( ) ;
do {
do {
@ -105,55 +110,30 @@ static void lcd_implementation_init()
u8g . setColorIndex ( 1 ) ;
u8g . setColorIndex ( 1 ) ;
} while ( u8g . nextPage ( ) ) ;
} while ( u8g . nextPage ( ) ) ;
# ifdef LCD_SCREEN_ROT_90
# if defined(LCD_SCREEN_ROT_90)
u8g . setRot90 ( ) ; // Rotate screen by 90°
u8g . setRot90 ( ) ; // Rotate screen by 90°
# endif
# elif defined(LCD_SCREEN_ROT_180)
# ifdef LCD_SCREEN_ROT_180
u8g . setRot180 ( ) ; // Rotate screen by 180°
u8g . setRot180 ( ) ; // Rotate screen by 180°
# endif
# elif defined(LCD_SCREEN_ROT_270)
# ifdef LCD_SCREEN_ROT_270
u8g . setRot270 ( ) ; // Rotate screen by 270°
u8g . setRot270 ( ) ; // Rotate screen by 270°
# endif
# endif
u8g . firstPage ( ) ;
u8g . firstPage ( ) ;
do {
do {
// RepRap init bmp
// RepRap init bmp
u8g . drawBitmapP ( 7 , 7 , START_BMPBYTEWIDTH , START_BMPHEIGHT , start_bmp ) ;
u8g . drawBitmapP ( 7 , 7 , START_BMPBYTEWIDTH , START_BMPHEIGHT , start_bmp ) ;
// Welcome message
// Welcome message
u8g . setFont ( u8g_font_5x8 ) ;
u8g . setFont ( u8g_font_5x8 ) ;
u8g . drawStr ( 7 , 51 , " V1.0.2 - marlin.reprap.org " ) ;
u8g . drawStr ( 7 , 51 , " V " MARLIN_VERSION " - marlin.reprap.org " ) ;
} while ( u8g . nextPage ( ) ) ;
} while ( u8g . nextPage ( ) ) ;
}
}
static void lcd_implementation_clear ( )
static void lcd_implementation_clear ( ) { } // Automatically cleared by Picture Loop
{
// NO NEED TO IMPLEMENT LIKE SO. Picture loop automatically clears the display.
//
// Check this article: http://arduino.cc/forum/index.php?topic=91395.25;wap2
//
// u8g.firstPage();
// do {
// u8g.setColorIndex(0);
// u8g.drawBox (0, 0, u8g.getWidth(), u8g.getHeight());
// u8g.setColorIndex(1);
// } while( u8g.nextPage() );
}
/* Arduino < 1.0.0 is missing a function to print PROGMEM strings, so we need to implement our own */
/* Arduino < 1.0.0 is missing a function to print PROGMEM strings, so we need to implement our own */
static void lcd_printPGM ( const char * str )
static void lcd_printPGM ( const char * str ) {
{
char c ;
char c ;
while ( ( c = pgm_read_byte ( str + + ) ) ! = ' \0 ' )
while ( ( c = pgm_read_byte ( str + + ) ) ) u8g . print ( c ) ;
{
u8g . print ( c ) ;
}
}
}
static void _draw_heater_status ( int x , int heater ) {
static void _draw_heater_status ( int x , int heater ) {
@ -176,8 +156,7 @@ static void _draw_heater_status(int x, int heater) {
}
}
}
}
static void lcd_implementation_status_screen ( )
static void lcd_implementation_status_screen ( ) {
{
static unsigned char fan_rot = 0 ;
static unsigned char fan_rot = 0 ;
@ -187,35 +166,31 @@ static void lcd_implementation_status_screen()
u8g . drawBitmapP ( 9 , 1 , STATUS_SCREENBYTEWIDTH , STATUS_SCREENHEIGHT , ( blink % 2 ) & & fanSpeed ? status_screen0_bmp : status_screen1_bmp ) ;
u8g . drawBitmapP ( 9 , 1 , STATUS_SCREENBYTEWIDTH , STATUS_SCREENHEIGHT , ( blink % 2 ) & & fanSpeed ? status_screen0_bmp : status_screen1_bmp ) ;
# ifdef SDSUPPORT
# ifdef SDSUPPORT
// SD Card Symbol
// SD Card Symbol
u8g . drawBox ( 42 , 42 , 8 , 7 ) ;
u8g . drawBox ( 42 , 42 , 8 , 7 ) ;
u8g . drawBox ( 50 , 44 , 2 , 5 ) ;
u8g . drawBox ( 50 , 44 , 2 , 5 ) ;
u8g . drawFrame ( 42 , 49 , 10 , 4 ) ;
u8g . drawFrame ( 42 , 49 , 10 , 4 ) ;
u8g . drawPixel ( 50 , 43 ) ;
u8g . drawPixel ( 50 , 43 ) ;
// Progress bar
// Progress bar frame
u8g . drawFrame ( 54 , 49 , 73 , 4 ) ;
u8g . drawFrame ( 54 , 49 , 73 , 4 ) ;
// SD Card Progress bar and clock
// SD Card Progress bar and clock
u8g . setFont ( FONT_STATUSMENU ) ;
u8g . setFont ( FONT_STATUSMENU ) ;
if ( IS_SD_PRINTING )
if ( IS_SD_PRINTING ) {
{
// Progress bar solid part
// Progress bar
u8g . drawBox ( 55 , 50 , ( unsigned int ) ( 71.f * card . percentDone ( ) / 100.f ) , 2 ) ;
u8g . drawBox ( 55 , 50 , ( unsigned int ) ( ( 71 * card . percentDone ( ) ) / 100 ) , 2 ) ;
}
else {
// do nothing
}
}
u8g . setPrintPos ( 80 , 47 ) ;
u8g . setPrintPos ( 80 , 47 ) ;
if ( starttime ! = 0 )
if ( starttime ! = 0 ) {
{
uint16_t time = millis ( ) / 60000 - starttime / 60000 ;
uint16_t time = millis ( ) / 60000 - starttime / 60000 ;
u8g . print ( itostr2 ( time / 60 ) ) ;
u8g . print ( itostr2 ( time / 60 ) ) ;
u8g . print ( ' : ' ) ;
u8g . print ( ' : ' ) ;
u8g . print ( itostr2 ( time % 60 ) ) ;
u8g . print ( itostr2 ( time % 60 ) ) ;
} else {
}
else {
lcd_printPGM ( PSTR ( " --:-- " ) ) ;
lcd_printPGM ( PSTR ( " --:-- " ) ) ;
}
}
# endif
# endif
@ -242,7 +217,6 @@ static void lcd_implementation_status_screen()
u8g . print ( " --- " ) ;
u8g . print ( " --- " ) ;
# endif
# endif
// X, Y, Z-Coordinates
// X, Y, Z-Coordinates
u8g . setFont ( FONT_STATUSMENU ) ;
u8g . setFont ( FONT_STATUSMENU ) ;
u8g . drawBox ( 0 , 29 , 128 , 10 ) ;
u8g . drawBox ( 0 , 29 , 128 , 10 ) ;
@ -282,11 +256,10 @@ static void lcd_implementation_status_screen()
# ifndef FILAMENT_LCD_DISPLAY
# ifndef FILAMENT_LCD_DISPLAY
u8g . print ( lcd_status_message ) ;
u8g . print ( lcd_status_message ) ;
# else
# else
if ( message_millis + 5000 > millis ( ) ) { //Display both Status message line and Filament display on the last line
if ( millis ( ) < message_millis + 5000 ) { //Display both Status message line and Filament display on the last line
u8g . print ( lcd_status_message ) ;
u8g . print ( lcd_status_message ) ;
}
}
else
else {
{
lcd_printPGM ( PSTR ( " dia: " ) ) ;
lcd_printPGM ( PSTR ( " dia: " ) ) ;
u8g . print ( ftostr12ns ( filament_width_meas ) ) ;
u8g . print ( ftostr12ns ( filament_width_meas ) ) ;
lcd_printPGM ( PSTR ( " factor: " ) ) ;
lcd_printPGM ( PSTR ( " factor: " ) ) ;
@ -294,35 +267,31 @@ static void lcd_implementation_status_screen()
u8g . print ( ' % ' ) ;
u8g . print ( ' % ' ) ;
}
}
# endif
# endif
}
}
static void lcd_implementation_drawmenu_generic ( uint8_t row , const char * pstr , char pre_char , char post_char )
static void lcd_implementation_drawmenu_generic ( uint8_t row , const char * pstr , char pre_char , char post_char ) {
{
char c ;
char c ;
uint8_t n = LCD_WIDTH - 1 - 2 ;
uint8_t n = LCD_WIDTH - 1 - 2 ;
if ( ( pre_char = = ' > ' ) | | ( pre_char = = LCD_STR_UPLEVEL [ 0 ] ) )
if ( ( pre_char = = ' > ' ) | | ( pre_char = = LCD_STR_UPLEVEL [ 0 ] ) ) {
{
u8g . setColorIndex ( 1 ) ; // black on white
u8g . setColorIndex ( 1 ) ; // black on white
u8g . drawBox ( 0 , row * DOG_CHAR_HEIGHT + 3 , 128 , DOG_CHAR_HEIGHT ) ;
u8g . drawBox ( 0 , row * DOG_CHAR_HEIGHT + 3 , 128 , DOG_CHAR_HEIGHT ) ;
u8g . setColorIndex ( 0 ) ; // following text must be white on black
u8g . setColorIndex ( 0 ) ; // following text must be white on black
} else u8g . setColorIndex ( 1 ) ; // unmarked text is black on white
}
else {
u8g . setColorIndex ( 1 ) ; // unmarked text is black on white
}
u8g . setPrintPos ( 0 * DOG_CHAR_WIDTH , ( row + 1 ) * DOG_CHAR_HEIGHT ) ;
u8g . setPrintPos ( 0 * DOG_CHAR_WIDTH , ( row + 1 ) * DOG_CHAR_HEIGHT ) ;
u8g . print ( pre_char = = ' > ' ? ' ' : pre_char ) ; // Row selector is obsolete
u8g . print ( pre_char = = ' > ' ? ' ' : pre_char ) ; // Row selector is obsolete
while ( ( c = pgm_read_byte ( pstr ) ) ) {
while ( ( c = pgm_read_byte ( pstr ) ) ! = ' \0 ' )
{
u8g . print ( c ) ;
u8g . print ( c ) ;
pstr + + ;
pstr + + ;
n - - ;
n - - ;
}
}
while ( n - - ) {
while ( n - - ) u8g . print ( ' ' ) ;
u8g . print ( ' ' ) ;
}
u8g . print ( post_char ) ;
u8g . print ( post_char ) ;
u8g . print ( ' ' ) ;
u8g . print ( ' ' ) ;
@ -391,8 +360,7 @@ static void _drawmenu_setting_edit_generic(uint8_t row, const char* pstr, char p
# define lcd_implementation_drawmenu_setting_edit_callback_bool_selected(row, pstr, pstr2, data, callback) lcd_implementation_drawmenu_setting_edit_generic_P(row, pstr, '>', (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF))
# define lcd_implementation_drawmenu_setting_edit_callback_bool_selected(row, pstr, pstr2, data, callback) lcd_implementation_drawmenu_setting_edit_generic_P(row, pstr, '>', (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF))
# define lcd_implementation_drawmenu_setting_edit_callback_bool(row, pstr, pstr2, data, callback) lcd_implementation_drawmenu_setting_edit_generic_P(row, pstr, ' ', (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF))
# define lcd_implementation_drawmenu_setting_edit_callback_bool(row, pstr, pstr2, data, callback) lcd_implementation_drawmenu_setting_edit_generic_P(row, pstr, ' ', (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF))
void lcd_implementation_drawedit ( const char * pstr , char * value )
void lcd_implementation_drawedit ( const char * pstr , char * value ) {
{
u8g . setPrintPos ( 0 * DOG_CHAR_WIDTH_LARGE , ( u8g . getHeight ( ) - 1 - DOG_CHAR_HEIGHT_LARGE ) - ( 1 * DOG_CHAR_HEIGHT_LARGE ) - START_ROW ) ;
u8g . setPrintPos ( 0 * DOG_CHAR_WIDTH_LARGE , ( u8g . getHeight ( ) - 1 - DOG_CHAR_HEIGHT_LARGE ) - ( 1 * DOG_CHAR_HEIGHT_LARGE ) - START_ROW ) ;
u8g . setFont ( u8g_font_9x18 ) ;
u8g . setFont ( u8g_font_9x18 ) ;
lcd_printPGM ( pstr ) ;
lcd_printPGM ( pstr ) ;
@ -445,20 +413,16 @@ static void _drawmenu_sd(uint8_t row, const char* pstr, const char* filename, ch
# define lcd_implementation_drawmenu_function_selected(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, '>', ' ')
# define lcd_implementation_drawmenu_function_selected(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, '>', ' ')
# define lcd_implementation_drawmenu_function(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, ' ', ' ')
# define lcd_implementation_drawmenu_function(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, ' ', ' ')
static void lcd_implementation_quick_feedback ( )
static void lcd_implementation_quick_feedback ( ) {
{
# if BEEPER > -1
# if BEEPER > -1
SET_OUTPUT ( BEEPER ) ;
SET_OUTPUT ( BEEPER ) ;
for ( int8_t i = 0 ; i < 10 ; i + + )
for ( int8_t i = 0 ; i < 10 ; i + + ) {
{
WRITE ( BEEPER , HIGH ) ;
WRITE ( BEEPER , HIGH ) ;
delay ( 3 ) ;
delay ( 3 ) ;
WRITE ( BEEPER , LOW ) ;
WRITE ( BEEPER , LOW ) ;
delay ( 3 ) ;
delay ( 3 ) ;
}
}
# endif
# endif
}
}
# endif //ULTRA_LCD_IMPLEMENTATION_DOGM_H
# endif //__DOGM_LCD_IMPLEMENTATION_H