* add u8g2 and ui libs * add display driver and usage example * not init display in test mode * change todo text * fix removed code * Target f2 (#107) * add ioc for flipperzero f2 * add generated f1 files to f2 * regenerate cubemx * invert initial state of led * blink backligh * shutdown backlight on idle
		
			
				
	
	
		
			256 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			256 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 | 
						|
  u8g2_hvline.c
 | 
						|
 | 
						|
  Universal 8bit Graphics Library (https://github.com/olikraus/u8g2/)
 | 
						|
 | 
						|
  Copyright (c) 2016, olikraus@gmail.com
 | 
						|
  All rights reserved.
 | 
						|
 | 
						|
  Redistribution and use in source and binary forms, with or without modification, 
 | 
						|
  are permitted provided that the following conditions are met:
 | 
						|
 | 
						|
  * Redistributions of source code must retain the above copyright notice, this list 
 | 
						|
    of conditions and the following disclaimer.
 | 
						|
    
 | 
						|
  * Redistributions in binary form must reproduce the above copyright notice, this 
 | 
						|
    list of conditions and the following disclaimer in the documentation and/or other 
 | 
						|
    materials provided with the distribution.
 | 
						|
 | 
						|
  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
 | 
						|
  CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
 | 
						|
  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
 | 
						|
  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 | 
						|
  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
 | 
						|
  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 | 
						|
  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
 | 
						|
  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 | 
						|
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
 | 
						|
  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
 | 
						|
  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 | 
						|
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
 | 
						|
  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
 | 
						|
 | 
						|
 | 
						|
  Calltree
 | 
						|
  
 | 
						|
    void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir)
 | 
						|
    u8g2->cb->draw_l90
 | 
						|
    u8g2_draw_hv_line_2dir
 | 
						|
    u8g2->ll_hvline(u8g2, x, y, len, dir);
 | 
						|
    
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
#include "u8g2.h"
 | 
						|
#include <assert.h>
 | 
						|
 | 
						|
/*==========================================================*/
 | 
						|
/* intersection procedure */
 | 
						|
 | 
						|
/*
 | 
						|
  Description:
 | 
						|
    clip range from pos a (included) with line len (a+len excluded) agains c (included) to d (excluded)
 | 
						|
  Assumptions:
 | 
						|
    len > 0
 | 
						|
    c <= d		(this is not checked)
 | 
						|
  will return 0 if there is no intersection and if a > b
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
static uint8_t u8g2_clip_intersection2(u8g2_uint_t *ap, u8g2_uint_t *len, u8g2_uint_t c, u8g2_uint_t d)
 | 
						|
{
 | 
						|
  u8g2_uint_t a = *ap;
 | 
						|
  u8g2_uint_t b;
 | 
						|
  b  = a;
 | 
						|
  b += *len;
 | 
						|
 | 
						|
  /*
 | 
						|
    Description:
 | 
						|
      clip range from a (included) to b (excluded) agains c (included) to d (excluded)
 | 
						|
    Assumptions:
 | 
						|
      a <= b		(violation is checked and handled correctly)
 | 
						|
      c <= d		(this is not checked)
 | 
						|
    will return 0 if there is no intersection and if a > b
 | 
						|
 | 
						|
    optimized clipping: c is set to 0 --> 27 Oct 2018: again removed the c==0 assumption
 | 
						|
    
 | 
						|
    replaced by uint8_t u8g2_clip_intersection2
 | 
						|
  */
 | 
						|
 | 
						|
  /* handle the a>b case correctly. If code and time is critical, this could */
 | 
						|
  /* be removed completly (be aware about memory curruption for wrong */
 | 
						|
  /* arguments) or return 0 for a>b (will lead to skipped lines for wrong */
 | 
						|
  /* arguments) */  
 | 
						|
  
 | 
						|
  /* removing the following if clause completly may lead to memory corruption of a>b */
 | 
						|
  if ( a > b )
 | 
						|
  {    
 | 
						|
    /* replacing this if with a simple "return 0;" will not handle the case with negative a */    
 | 
						|
    if ( a < d )
 | 
						|
    {
 | 
						|
      b = d;
 | 
						|
      b--;
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
      a = c;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  
 | 
						|
  /* from now on, the asumption a <= b is ok */
 | 
						|
  
 | 
						|
  if ( a >= d )
 | 
						|
    return 0;
 | 
						|
  if ( b <= c )
 | 
						|
    return 0;
 | 
						|
  if ( a < c )		
 | 
						|
    a = c;
 | 
						|
  if ( b > d )
 | 
						|
    b = d;
 | 
						|
  
 | 
						|
  *ap = a;
 | 
						|
  b -= a;
 | 
						|
  *len = b;
 | 
						|
  return 1;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/*==========================================================*/
 | 
						|
/* draw procedures */
 | 
						|
 | 
						|
/*
 | 
						|
  x,y		Upper left position of the line within the pixel buffer 
 | 
						|
  len		length of the line in pixel, len must not be 0
 | 
						|
  dir		0: horizontal line (left to right)
 | 
						|
		1: vertical line (top to bottom)
 | 
						|
  This function first adjusts the y position to the local buffer. Then it
 | 
						|
  will clip the line and call u8g2_draw_low_level_hv_line()
 | 
						|
 | 
						|
*/
 | 
						|
void u8g2_draw_hv_line_2dir(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir)
 | 
						|
{
 | 
						|
 | 
						|
  /* clipping happens before the display rotation */
 | 
						|
 | 
						|
  /* transform to pixel buffer coordinates */
 | 
						|
  y -= u8g2->pixel_curr_row;
 | 
						|
  
 | 
						|
  u8g2->ll_hvline(u8g2, x, y, len, dir);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
  This is the toplevel function for the hv line draw procedures.
 | 
						|
  This function should be called by the user.
 | 
						|
  
 | 
						|
  "dir" may have 4 directions: 0 (left to right), 1, 2, 3 (down up)
 | 
						|
*/
 | 
						|
void u8g2_DrawHVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len, uint8_t dir)
 | 
						|
{
 | 
						|
  /* Make a call to the callback function (e.g. u8g2_draw_l90_r0). */
 | 
						|
  /* The callback may rotate the hv line */
 | 
						|
  /* after rotation this will call u8g2_draw_hv_line_4dir() */
 | 
						|
  
 | 
						|
#ifdef U8G2_WITH_CLIP_WINDOW_SUPPORT
 | 
						|
  if ( u8g2->is_page_clip_window_intersection != 0 )
 | 
						|
#endif /* U8G2_WITH_CLIP_WINDOW_SUPPORT */
 | 
						|
    if ( len != 0 )
 | 
						|
    {
 | 
						|
    
 | 
						|
      /* convert to two directions */    
 | 
						|
      if ( len > 1 )
 | 
						|
      {
 | 
						|
	if ( dir == 2 )
 | 
						|
	{
 | 
						|
	  x -= len;
 | 
						|
	  x++;
 | 
						|
	}
 | 
						|
	else if ( dir == 3 )
 | 
						|
	{
 | 
						|
	  y -= len;
 | 
						|
	  y++;
 | 
						|
	}
 | 
						|
      }
 | 
						|
      dir &= 1;  
 | 
						|
      
 | 
						|
      /* clip against the user window */
 | 
						|
      if ( dir == 0 )
 | 
						|
      {
 | 
						|
	if ( y < u8g2->user_y0 )
 | 
						|
	  return;
 | 
						|
	if ( y >= u8g2->user_y1 )
 | 
						|
	  return;
 | 
						|
	if ( u8g2_clip_intersection2(&x, &len, u8g2->user_x0, u8g2->user_x1) == 0 )
 | 
						|
	  return;
 | 
						|
      }
 | 
						|
      else
 | 
						|
      {
 | 
						|
	if ( x < u8g2->user_x0 )
 | 
						|
	  return;
 | 
						|
	if ( x >= u8g2->user_x1 )
 | 
						|
	  return;
 | 
						|
	if ( u8g2_clip_intersection2(&y, &len, u8g2->user_y0, u8g2->user_y1) == 0 )
 | 
						|
	  return;
 | 
						|
      }
 | 
						|
      
 | 
						|
      
 | 
						|
      u8g2->cb->draw_l90(u8g2, x, y, len, dir);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void u8g2_DrawHLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len)
 | 
						|
{
 | 
						|
// #ifdef U8G2_WITH_INTERSECTION
 | 
						|
//   if ( u8g2_IsIntersection(u8g2, x, y, x+len, y+1) == 0 ) 
 | 
						|
//     return;
 | 
						|
// #endif /* U8G2_WITH_INTERSECTION */
 | 
						|
  u8g2_DrawHVLine(u8g2, x, y, len, 0);
 | 
						|
}
 | 
						|
 | 
						|
void u8g2_DrawVLine(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t len)
 | 
						|
{
 | 
						|
// #ifdef U8G2_WITH_INTERSECTION
 | 
						|
//   if ( u8g2_IsIntersection(u8g2, x, y, x+1, y+len) == 0 ) 
 | 
						|
//     return;
 | 
						|
// #endif /* U8G2_WITH_INTERSECTION */
 | 
						|
  u8g2_DrawHVLine(u8g2, x, y, len, 1);
 | 
						|
}
 | 
						|
 | 
						|
void u8g2_DrawPixel(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y)
 | 
						|
{
 | 
						|
#ifdef U8G2_WITH_INTERSECTION
 | 
						|
  if ( y < u8g2->user_y0 )
 | 
						|
    return;
 | 
						|
  if ( y >= u8g2->user_y1 )
 | 
						|
    return;
 | 
						|
  if ( x < u8g2->user_x0 )
 | 
						|
    return;
 | 
						|
  if ( x >= u8g2->user_x1 )
 | 
						|
    return;
 | 
						|
#endif /* U8G2_WITH_INTERSECTION */
 | 
						|
  u8g2_DrawHVLine(u8g2, x, y, 1, 0);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Assign the draw color for all drawing functions.
 | 
						|
  color may be 0 or 1. The actual color is defined by the display.
 | 
						|
  With color = 1 the drawing function will set the display memory to 1.
 | 
						|
  For OLEDs this ususally means, that the pixel is enabled and the LED 
 | 
						|
  at the pixel is turned on.
 | 
						|
  On an LCD it usually means that the LCD segment of the pixel is enabled, 
 | 
						|
  which absorbs the light.
 | 
						|
  For eInk/ePaper it means black ink.
 | 
						|
 | 
						|
  7 Jan 2017: Allow color value 2 for XOR operation.
 | 
						|
  
 | 
						|
*/
 | 
						|
void u8g2_SetDrawColor(u8g2_t *u8g2, uint8_t color)
 | 
						|
{
 | 
						|
  u8g2->draw_color = color;	/* u8g2_SetDrawColor: just assign the argument */ 
 | 
						|
  if ( color >= 3 )
 | 
						|
    u8g2->draw_color = 1;	/* u8g2_SetDrawColor: make color as one if arg is invalid */
 | 
						|
}
 | 
						|
 |