@ -12,10 +12,12 @@ class DisplayMono128X64 : public DisplayMono { 
			
		
	
		
		
			
				
					            mExtra  =  0 ;             mExtra  =  0 ;  
			
		
	
		
		
			
				
					        }         }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					
					        void  config ( bool  enPowerSave ,  uint8_t  screenSaver ,  uint8_t  lum )  {         void  config ( bool  enPowerSave ,  uint8_t  screenSaver ,  uint8_t  lum ,  uint8_t  graph_ratio ,  uint8_t  graph_size )  {  
			
				
				
			
		
	
		
		
	
		
		
			
				
					            mEnPowerSave  =  enPowerSave ;             mEnPowerSave  =  enPowerSave ;  
			
		
	
		
		
			
				
					            mScreenSaver  =  screenSaver ;             mScreenSaver  =  screenSaver ;  
			
		
	
		
		
			
				
					            mLuminance  =  lum ;             mLuminance  =  lum ;  
			
		
	
		
		
			
				
					            mGraphRatio  =  graph_ratio ;  
			
		
	
		
		
			
				
					            mGraphSize   =  graph_size ;  
			
		
	
		
		
			
				
					        }         }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					        void  init ( uint8_t  type ,  uint8_t  rotation ,  uint8_t  cs ,  uint8_t  dc ,  uint8_t  reset ,  uint8_t  clock ,  uint8_t  data ,  DisplayData  * displayData )  {         void  init ( uint8_t  type ,  uint8_t  rotation ,  uint8_t  cs ,  uint8_t  dc ,  uint8_t  reset ,  uint8_t  clock ,  uint8_t  data ,  DisplayData  * displayData )  {  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -34,6 +36,34 @@ class DisplayMono128X64 : public DisplayMono { 
			
		
	
		
		
			
				
					            }             }  
			
		
	
		
		
			
				
					            calcLinePositions ( ) ;             calcLinePositions ( ) ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					            switch ( mGraphSize )  {  // var opts2 = [[0, "Line 1 - 2"], [1, "Line 2 - 3"], [2, "Line 1 - 3"], [3, "Line 2 - 4"], [4, "Line 1 - 4"]];
  
			
		
	
		
		
			
				
					                case  0 :  
			
		
	
		
		
			
				
					                    graph_first_line  =  1 ;  
			
		
	
		
		
			
				
					                    graph_last_line  =  2 ;  
			
		
	
		
		
			
				
					                    break ;  
			
		
	
		
		
			
				
					                case  1 :  
			
		
	
		
		
			
				
					                    graph_first_line  =  2 ;  
			
		
	
		
		
			
				
					                    graph_last_line  =  3 ;  
			
		
	
		
		
			
				
					                    break ;  
			
		
	
		
		
			
				
					                case  2 :  
			
		
	
		
		
			
				
					                    graph_first_line  =  1 ;  
			
		
	
		
		
			
				
					                    graph_last_line  =  3 ;  
			
		
	
		
		
			
				
					                    break ;  
			
		
	
		
		
			
				
					                case  3 :  
			
		
	
		
		
			
				
					                    graph_first_line  =  2 ;  
			
		
	
		
		
			
				
					                    graph_last_line  =  4 ;  
			
		
	
		
		
			
				
					                    break ;  
			
		
	
		
		
			
				
					                case  4 :  
			
		
	
		
		
			
				
					                default :  
			
		
	
		
		
			
				
					                    graph_first_line  =  1 ;  
			
		
	
		
		
			
				
					                    graph_last_line  =  4 ;  
			
		
	
		
		
			
				
					                    break ;  
			
		
	
		
		
			
				
					            }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					            widthShrink  =  ( mScreenSaver  = =  1 )  ?  pixelShiftRange  :  0 ;   // shrink graphwidth for pixelshift screensaver
  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					            initPowerGraph ( mDispWidth  -  22  -  widthShrink ,  mLineYOffsets [ graph_last_line ]  -  mLineYOffsets [ graph_first_line  -  1 ]  -  2 ) ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					            printText ( " Ahoy! " ,  l_Ahoy ,  0xff ) ;             printText ( " Ahoy! " ,  l_Ahoy ,  0xff ) ;  
			
		
	
		
		
			
				
					            printText ( " ahoydtu.de " ,  l_Website ,  0xff ) ;             printText ( " ahoydtu.de " ,  l_Website ,  0xff ) ;  
			
		
	
		
		
			
				
					            printText ( mDisplayData - > version ,  l_Version ,  0xff ) ;             printText ( mDisplayData - > version ,  l_Version ,  0xff ) ;  
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -61,106 +91,118 @@ class DisplayMono128X64 : public DisplayMono { 
			
		
	
		
		
			
				
					            // calculate current pixelshift for pixelshift screensaver
             // calculate current pixelshift for pixelshift screensaver
  
			
		
	
		
		
			
				
					            calcPixelShift ( pixelShiftRange ) ;             calcPixelShift ( pixelShiftRange ) ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					
					            // print total power 
             // add new power data to power graph 
  
			
				
				
			
		
	
		
		
	
		
		
			
				
					            if  ( mDisplayData - > nrProducing  >  0 )  {             if  ( mDisplayData - > nrProducing  >  0 )  {  
			
		
	
		
		
			
				
					
					                if  ( mDisplayData - > totalPower  >  9999.0 )                 addPowerGraphEntry ( mDisplayData - > totalPower ) ;  
			
				
				
			
		
	
		
		
			
				
					                    snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  " %.2f kW " ,  ( mDisplayData - > totalPower  /  1000.0 ) ) ;  
			
		
	
		
		
			
				
					                else  
			
		
	
		
		
			
				
					                    snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  " %.0f W " ,  mDisplayData - > totalPower ) ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					                printText ( mFmtText ,  l_TotalPower ,  0xff ) ;  
			
		
	
		
		
			
				
					            }  else  {  
			
		
	
		
		
			
				
					                printText ( " offline " ,  l_TotalPower ,  0xff ) ;  
			
		
	
		
		
	
		
		
			
				
					            }             }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					            // print Date and time
             // print Date and time
  
			
		
	
		
		
			
				
					            if  ( 0  ! =  mDisplayData - > utcTs )             if  ( 0  ! =  mDisplayData - > utcTs )  
			
		
	
		
		
			
				
					                printText ( ah : : getDateTimeStrShort ( gTimezone . toLocal ( mDisplayData - > utcTs ) ) . c_str ( ) ,  l_Time ,  0xff ) ;                 printText ( ah : : getDateTimeStrShort ( gTimezone . toLocal ( mDisplayData - > utcTs ) ) . c_str ( ) ,  l_Time ,  0xff ) ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					
					            // dynamic status bar, alternatively:
             if  ( showLine ( l_Status ) )  {  
			
				
				
			
		
	
		
		
			
				
					
					            // print ip address
                 // alternatively:
  
			
				
				
			
		
	
		
		
			
				
					
					            if  ( ! ( mExtra  %  5 )  & &  ( mDisplayData - > ipAddress ) )  {                 // print ip address
  
			
				
				
			
		
	
		
		
			
				
					
					                snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  " %s " ,  ( mDisplayData - > ipAddress ) . toString ( ) . c_str ( ) ) ;                 if  ( ! ( mExtra  %  5 )  & &  ( mDisplayData - > ipAddress ) )  {  
			
				
				
			
		
	
		
		
			
				
					
					                printText ( mFmtText ,  l_Status ,  0xff ) ;                     snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  " %s " ,  ( mDisplayData - > ipAddress ) . toString ( ) . c_str ( ) ) ;  
			
				
				
			
		
	
		
		
			
				
					
					            }                     printText ( mFmtText ,  l_Status ,  0xff ) ;  
			
				
				
			
		
	
		
		
			
				
					            // print status of inverters
  
			
		
	
		
		
			
				
					            else  {  
			
		
	
		
		
			
				
					                sun_pos  =  - 1 ;  
			
		
	
		
		
			
				
					                moon_pos  =  - 1 ;  
			
		
	
		
		
			
				
					                setLineFont ( l_Status ) ;  
			
		
	
		
		
			
				
					                if  ( 0  = =  mDisplayData - > nrSleeping  +  mDisplayData - > nrProducing )  
			
		
	
		
		
			
				
					                    snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  " no inverter " ) ;  
			
		
	
		
		
			
				
					                else  if  ( 0  = =  mDisplayData - > nrSleeping )  {  
			
		
	
		
		
			
				
					                    snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  "    " ) ;  
			
		
	
		
		
			
				
					                    sun_pos  =  0 ;  
			
		
	
		
		
			
				
					                }  
			
		
	
		
		
			
				
					                else  if  ( 0  = =  mDisplayData - > nrProducing )  {  
			
		
	
		
		
			
				
					                    snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  "    " ) ;  
			
		
	
		
		
			
				
					                    moon_pos  =  0 ;  
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					                }                 }  
			
		
	
		
		
			
				
					                // print status of inverters
  
			
		
	
		
		
			
				
					                else  {                 else  {  
			
		
	
		
		
			
				
					
					                    snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  " %2d " ,  mDisplayData - > nrProducing ) ;                     sun_pos  =  - 1 ;  
			
				
				
			
		
	
		
		
			
				
					
					                    sun_pos  =  mDisplay - > getStrWidth ( mFmtText )  +  1 ;                     moon_pos  =  - 1 ;  
			
				
				
			
		
	
		
		
			
				
					
					                    snprintf ( mFmtText + 2 ,  DISP_FMT_TEXT_LEN ,  "    %2d " ,  mDisplayData - > nrSleeping ) ;                     setLineFont ( l_Status ) ;  
			
				
				
			
		
	
		
		
			
				
					
					                    moon_pos  =  mDisplay - > getStrWidth ( mFmtText )  +  1 ;                     if  ( 0  = =  mDisplayData - > nrSleeping  +  mDisplayData - > nrProducing )  
			
				
				
			
		
	
		
		
			
				
					
					                    snprintf ( mFmtText + 7 ,  DISP_FMT_TEXT_LEN ,  "   " ) ;                         snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  " no inverter " ) ;  
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					                    else  if  ( 0  = =  mDisplayData - > nrSleeping )  {  
			
		
	
		
		
			
				
					                        snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  "    " ) ;  
			
		
	
		
		
			
				
					                        sun_pos  =  0 ;  
			
		
	
		
		
			
				
					                    }  
			
		
	
		
		
			
				
					                    else  if  ( 0  = =  mDisplayData - > nrProducing )  {  
			
		
	
		
		
			
				
					                        snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  "    " ) ;  
			
		
	
		
		
			
				
					                        moon_pos  =  0 ;  
			
		
	
		
		
			
				
					                    }  
			
		
	
		
		
			
				
					                    else  {  
			
		
	
		
		
			
				
					                        snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  " %2d " ,  mDisplayData - > nrProducing ) ;  
			
		
	
		
		
			
				
					                        sun_pos  =  mDisplay - > getStrWidth ( mFmtText )  +  1 ;  
			
		
	
		
		
			
				
					                        snprintf ( mFmtText + 2 ,  DISP_FMT_TEXT_LEN ,  "    %2d " ,  mDisplayData - > nrSleeping ) ;  
			
		
	
		
		
			
				
					                        moon_pos  =  mDisplay - > getStrWidth ( mFmtText )  +  1 ;  
			
		
	
		
		
			
				
					                        snprintf ( mFmtText + 7 ,  DISP_FMT_TEXT_LEN ,  "   " ) ;  
			
		
	
		
		
			
				
					                    }  
			
		
	
		
		
			
				
					                    printText ( mFmtText ,  l_Status ,  0xff ) ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					                    pos  =  ( mDispWidth  -  mDisplay - > getStrWidth ( mFmtText ) )  /  2 ;  
			
		
	
		
		
			
				
					                    mDisplay - > setFont ( u8g2_font_ncenB08_symbols8_ahoy ) ;  
			
		
	
		
		
			
				
					                    if  ( sun_pos ! = - 1 )  
			
		
	
		
		
			
				
					                        mDisplay - > drawStr ( pos  +  sun_pos  +  mPixelshift ,  mLineYOffsets [ l_Status ] ,  " G " ) ;      // sun symbol
  
			
		
	
		
		
			
				
					                    if  ( moon_pos ! = - 1 )  
			
		
	
		
		
			
				
					                        mDisplay - > drawStr ( pos  +  moon_pos  +  mPixelshift ,  mLineYOffsets [ l_Status ] ,  " H " ) ;     // moon symbol
  
			
		
	
		
		
			
				
					                }                 }  
			
		
	
		
		
			
				
					                printText ( mFmtText ,  l_Status ,  0xff ) ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					                pos  =  ( mDispWidth  -  mDisplay - > getStrWidth ( mFmtText ) )  /  2 ;  
			
		
	
		
		
			
				
					                mDisplay - > setFont ( u8g2_font_ncenB08_symbols8_ahoy ) ;  
			
		
	
		
		
			
				
					                if  ( sun_pos ! = - 1 )  
			
		
	
		
		
			
				
					                    mDisplay - > drawStr ( pos  +  sun_pos  +  mPixelshift ,  mLineYOffsets [ l_Status ] ,  " G " ) ;      // sun symbol
  
			
		
	
		
		
			
				
					                if  ( moon_pos ! = - 1 )  
			
		
	
		
		
			
				
					                    mDisplay - > drawStr ( pos  +  moon_pos  +  mPixelshift ,  mLineYOffsets [ l_Status ] ,  " H " ) ;     // moon symbol
  
			
		
	
		
		
			
				
					            }             }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					
					            // print yields
             if  ( showLine ( l_TotalPower ) )  {  
			
				
				
			
		
	
		
		
			
				
					
					            mDisplay - > setFont ( u8g2_font_ncenB10_symbols10_ahoy ) ;                 // print total power
  
			
				
				
			
		
	
		
		
			
				
					
					            mDisplay - > drawStr ( 16  +  mPixelshift ,  mLineYOffsets [ l_YieldDay ] ,    " I " ) ;     // day symbol
                 if  ( mDisplayData - > nrProducing  >  0 )  {  
			
				
				
			
		
	
		
		
			
				
					
					            mDisplay - > drawStr ( 16  +  mPixelshift ,  mLineYOffsets [ l_YieldTotal ] ,  " D " ) ;     // total symbol
                     if  ( mDisplayData - > totalPower  >  9999.0 )  
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					                        snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  " %.2f kW " ,  ( mDisplayData - > totalPower  /  1000.0 ) ) ;  
			
		
	
		
		
			
				
					                    else  
			
		
	
		
		
			
				
					                        snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  " %.0f W " ,  mDisplayData - > totalPower ) ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					
					            if  ( mDisplayData - > totalYieldDay  >  9999.0 )                     printText ( mFmtText ,  l_TotalPower ,  0xff ) ;   
			
				
				
			
		
	
		
		
			
				
					
					                snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  " %.2f kWh " ,  mDisplayData - > totalYieldDay  /  1000.0 ) ;                 }  else  {  
			
				
				
			
		
	
		
		
			
				
					
					            else                     printText ( " offline " ,  l_TotalPower ,  0xff ) ;   
			
				
				
			
		
	
		
		
			
				
					
					                snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  " %.0f Wh " ,  mDisplayData - > totalYieldDay ) ;                 }  
			
				
				
			
		
	
		
		
			
				
					
					            printText ( mFmtText ,  l_YieldDay ,  0xff ) ;             }  
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					
					            if  ( mDisplayData - > totalYieldTotal  >  9999.0 )             if  ( showLine ( l_YieldDay ) )  {  
			
				
				
			
		
	
		
		
			
				
					
					                snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  " %.2f MWh " ,  mDisplayData - > totalYieldTotal  /  1000.0 ) ;                 // print day yield
  
			
				
				
			
		
	
		
		
			
				
					
					            else                 mDisplay - > setFont ( u8g2_font_ncenB10_symbols10_ahoy ) ;  
			
				
				
			
		
	
		
		
			
				
					
					                snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  " %.0f kWh " ,  mDisplayData - > totalYieldTotal ) ;                 mDisplay - > drawStr ( 16  +  mPixelshift ,  mLineYOffsets [ l_YieldDay ] ,    " I " ) ;     // day symbol
  
			
				
				
			
		
	
		
		
			
				
					
					            printText ( mFmtText ,  l_YieldTotal ,  0xff ) ;                 mDisplay - > drawStr ( 16  +  mPixelshift ,  mLineYOffsets [ l_YieldTotal ] ,  " D " ) ;     // total symbol
  
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					                if  ( mDisplayData - > totalYieldDay  >  9999.0 )  
			
		
	
		
		
			
				
					                    snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  " %.2f kWh " ,  mDisplayData - > totalYieldDay  /  1000.0 ) ;  
			
		
	
		
		
			
				
					                else  
			
		
	
		
		
			
				
					                    snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  " %.0f Wh " ,  mDisplayData - > totalYieldDay ) ;  
			
		
	
		
		
			
				
					                printText ( mFmtText ,  l_YieldDay ,  0xff ) ;  
			
		
	
		
		
			
				
					            }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					            if  ( showLine ( l_YieldTotal ) )  {  
			
		
	
		
		
			
				
					                // print total yield
  
			
		
	
		
		
			
				
					                if  ( mDisplayData - > totalYieldTotal  >  9999.0 )  
			
		
	
		
		
			
				
					                    snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  " %.2f MWh " ,  mDisplayData - > totalYieldTotal  /  1000.0 ) ;  
			
		
	
		
		
			
				
					                else  
			
		
	
		
		
			
				
					                    snprintf ( mFmtText ,  DISP_FMT_TEXT_LEN ,  " %.0f kWh " ,  mDisplayData - > totalYieldTotal ) ;  
			
		
	
		
		
			
				
					                printText ( mFmtText ,  l_YieldTotal ,  0xff ) ;  
			
		
	
		
		
			
				
					            }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					            if  ( mDispSwitchState  = =  d_POWER_GRAPH )  {  
			
		
	
		
		
			
				
					                // plot power graph
  
			
		
	
		
		
			
				
					                plotPowerGraph ( ( mDispWidth  -  mPgWidth )  /  2  +  mPixelshift ,  mLineYOffsets [ graph_last_line ]  -  1 ) ;  
			
		
	
		
		
			
				
					            }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					            // draw dynamic RSSI bars
             // draw dynamic RSSI bars
  
			
		
	
		
		
			
				
					            int  xoffs ;  
			
		
	
		
		
			
				
					            if  ( mScreenSaver  = =  1 )  // shrink screenwidth for pixelshift screensaver
  
			
		
	
		
		
			
				
					                xoffs  =  pixelShiftRange / 2 ;  
			
		
	
		
		
			
				
					            else  
			
		
	
		
		
			
				
					                xoffs  =  0 ;  
			
		
	
		
		
			
				
					            int  rssi_bar_height  =  9 ;             int  rssi_bar_height  =  9 ;  
			
		
	
		
		
			
				
					            for  ( int  i  =  0 ;  i  <  4 ;  i + + )  {             for  ( int  i  =  0 ;  i  <  4 ;  i + + )  {  
			
		
	
		
		
			
				
					                int  radio_rssi_threshold  =  - 60  -  i  *  10 ;                 int  radio_rssi_threshold  =  - 60  -  i  *  10 ;  
			
		
	
		
		
			
				
					                int  wifi_rssi_threshold  =  - 60  -  i  *  10 ;                 int  wifi_rssi_threshold  =  - 60  -  i  *  10 ;  
			
		
	
		
		
			
				
					                uint8_t  barwidth  =  std : : min ( 4  -  i ,  3 ) ;  
			
		
	
		
		
			
				
					                if  ( mDisplayData - > RadioRSSI  >  radio_rssi_threshold )                 if  ( mDisplayData - > RadioRSSI  >  radio_rssi_threshold )  
			
		
	
		
		
			
				
					
					                    mDisplay - > drawBox ( xoffs  +  mPixelshift ,  8  +  ( rssi_bar_height  +  1 )  *  i ,  4  -  i ,  rssi_bar_height ) ;                     mDisplay - > drawBox ( widthShrink  /  2 +  mPixelshift ,                           8  +  ( rssi_bar_height  +  1 )  *  i ,  barwidth ,  rssi_bar_height ) ;  
			
				
				
			
		
	
		
		
	
		
		
			
				
					                if  ( mDisplayData - > WifiRSSI  >  wifi_rssi_threshold )                 if  ( mDisplayData - > WifiRSSI  >  wifi_rssi_threshold )  
			
		
	
		
		
			
				
					
					                    mDisplay - > drawBox ( mDispWidth  -  4  -  xoffs  +  mPixelshift  +  i ,  8  +  ( rssi_bar_height  +  1 )  *  i ,  4  -  i ,  rssi_bar_height ) ;                     mDisplay - > drawBox ( mDispWidth  -  barwidth  -  widthShrink  /  2  +  mPixelshift ,  8  +  ( rssi_bar_height  +  1 )  *  i ,  barwidth ,  rssi_bar_height ) ;  
			
				
				
			
		
	
		
		
	
		
		
			
				
					            }             }  
			
		
	
		
		
			
				
					            // draw dynamic antenna and WiFi symbols
             // draw dynamic antenna and WiFi symbols
  
			
		
	
		
		
			
				
					            mDisplay - > setFont ( u8g2_font_ncenB10_symbols10_ahoy ) ;             mDisplay - > setFont ( u8g2_font_ncenB10_symbols10_ahoy ) ;  
			
		
	
		
		
			
				
					            char  sym [ ] = "   " ;             char  sym [ ] = "   " ;  
			
		
	
		
		
			
				
					            sym [ 0 ]  =  mDisplayData - > RadioSymbol ? ' A ' : ' E ' ;                  // NRF
             sym [ 0 ]  =  mDisplayData - > RadioSymbol ? ' A ' : ' E ' ;                  // NRF
  
			
		
	
		
		
			
				
					
					            mDisplay - > drawStr ( xoffs  +  mPixelshift ,  mLineYOffsets [ l_RSSI ] ,  sym ) ;             mDisplay - > drawStr ( widthShrink  /  2 +  mPixelshift ,  mLineYOffsets [ l_RSSI ] ,  sym ) ;  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					            if  ( mDisplayData - > MQTTSymbol )             if  ( mDisplayData - > MQTTSymbol )  
			
		
	
		
		
			
				
					                sym [ 0 ]  =  ' J ' ;  // MQTT
                 sym [ 0 ]  =  ' J ' ;  // MQTT
  
			
		
	
		
		
			
				
					            else             else  
			
		
	
		
		
			
				
					                sym [ 0 ]  =  mDisplayData - > WifiSymbol ? ' B ' : ' F ' ;               // Wifi
                 sym [ 0 ]  =  mDisplayData - > WifiSymbol ? ' B ' : ' F ' ;               // Wifi
  
			
		
	
		
		
			
				
					
					            mDisplay - > drawStr ( mDispWidth  -  mDisplay - > getStrWidth ( sym )  -  xoffs  +  mPixelshift ,  mLineYOffsets [ l_RSSI ] ,  sym ) ;             mDisplay - > drawStr ( mDispWidth  -  mDisplay - > getStrWidth ( sym )  -  widthShrink  /  2  +  mPixelshift ,  mLineYOffsets [ l_RSSI ] ,  sym ) ;  
			
				
				
			
		
	
		
		
			
				
					            mDisplay - > sendBuffer ( ) ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					
 
			
		
	
		
		
	
		
		
			
				
					            mDisplay - > sendBuffer ( ) ;             mDisplay - > sendBuffer ( ) ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					            mExtra + + ;             mExtra + + ;  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -184,7 +226,11 @@ class DisplayMono128X64 : public DisplayMono { 
			
		
	
		
		
			
				
					            l_MAX_LINES  =  5 ,             l_MAX_LINES  =  5 ,  
			
		
	
		
		
			
				
					        } ;         } ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					        uint8_t  graph_first_line ;  
			
		
	
		
		
			
				
					        uint8_t  graph_last_line ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					        const  uint8_t  pixelShiftRange  =  11 ;   // number of pixels to shift from left to right (centered -> must be odd!)
         const  uint8_t  pixelShiftRange  =  11 ;   // number of pixels to shift from left to right (centered -> must be odd!)
  
			
		
	
		
		
			
				
					        uint8_t  widthShrink ;  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					        void  calcLinePositions ( )  {         void  calcLinePositions ( )  {  
			
		
	
		
		
			
				
					            uint8_t  yOff  =  0 ;             uint8_t  yOff  =  0 ;  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -198,8 +244,8 @@ class DisplayMono128X64 : public DisplayMono { 
			
		
	
		
		
			
				
					                mLineYOffsets [ i ]  =  yOff ;                 mLineYOffsets [ i ]  =  yOff ;  
			
		
	
		
		
			
				
					                dsc  =  mDisplay - > getDescent ( ) ;                 dsc  =  mDisplay - > getDescent ( ) ;  
			
		
	
		
		
			
				
					                yOff  - =  dsc ;                 yOff  - =  dsc ;  
			
		
	
		
		
			
				
					
					                if  ( l_Time = = i )    // prevent time and status line to touch
                 if  ( l_Time   = =   i )    // prevent time and status line to touch
  
			
				
				
			
		
	
		
		
			
				
					
					                    yOff + = 1 ;      // -> one pixels space
                     yOff + + ;      // -> one pixels space
  
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					                i + + ;                 i + + ;  
			
		
	
		
		
			
				
					            }  while ( l_MAX_LINES > i ) ;             }  while ( l_MAX_LINES > i ) ;  
			
		
	
		
		
			
				
					        }         }  
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -226,4 +272,8 @@ class DisplayMono128X64 : public DisplayMono { 
			
		
	
		
		
			
				
					            dispX  + =  mPixelshift ;             dispX  + =  mPixelshift ;  
			
		
	
		
		
			
				
					            mDisplay - > drawStr ( dispX ,  mLineYOffsets [ line ] ,  text ) ;             mDisplay - > drawStr ( dispX ,  mLineYOffsets [ line ] ,  text ) ;  
			
		
	
		
		
			
				
					        }         }  
			
		
	
		
		
			
				
					
 
			
		
	
		
		
			
				
					        bool  showLine ( uint8_t  line )  {  
			
		
	
		
		
			
				
					            return  ( ( mDispSwitchState  = =  d_POWER_TEXT )  | |  ( ( line  <  graph_first_line )  | |  ( line  >  graph_last_line ) ) ) ;  
			
		
	
		
		
			
				
					        }  
			
		
	
		
		
			
				
					} ; } ;