/* ################################################################### ** This component module is generated by Processor Expert. Do not modify it. ** Filename : McuGDisplaySSD1306.h ** Project : FRDM-K64F_Generator ** Processor : MK64FN1M0VLL12 ** Component : GDisplay ** Version : Component 01.211, Driver 01.00, CPU db: 3.00.000 ** Compiler : GNU C Compiler ** Date/Time : 2024-07-09, 10:10, # CodeGen: 829 ** Abstract : ** Graphical display driver for LCD or other displays ** Settings : ** Component name : McuGDisplaySSD1306 ** SDK : McuLib ** Inverted Pixels : no ** Memory Buffer : Enabled ** Orientation : Landscape ** Clear screen on Init : no ** Hardware : ** Display : McuSSD1306 ** Watchdog : Disabled ** RTOS : Disabled ** Contents : ** PutPixel - void McuGDisplaySSD1306_PutPixel(McuGDisplaySSD1306_PixelDim x,... ** SetPixel - void McuGDisplaySSD1306_SetPixel(McuGDisplaySSD1306_PixelDim x,... ** ClrPixel - void McuGDisplaySSD1306_ClrPixel(McuGDisplaySSD1306_PixelDim x,... ** Clear - void McuGDisplaySSD1306_Clear(void); ** DrawBox - void McuGDisplaySSD1306_DrawBox(McuGDisplaySSD1306_PixelDim x,... ** DrawFilledBox - void McuGDisplaySSD1306_DrawFilledBox(McuGDisplaySSD1306_PixelDim x,... ** DrawHLine - void McuGDisplaySSD1306_DrawHLine(McuGDisplaySSD1306_PixelDim x,... ** DrawVLine - void McuGDisplaySSD1306_DrawVLine(McuGDisplaySSD1306_PixelDim x,... ** DrawLine - void McuGDisplaySSD1306_DrawLine(McuGDisplaySSD1306_PixelDim xstart,... ** DrawCircle - void McuGDisplaySSD1306_DrawCircle(McuGDisplaySSD1306_PixelDim x0,... ** DrawFilledCircle - void McuGDisplaySSD1306_DrawFilledCircle(McuGDisplaySSD1306_PixelDim x0,... ** DrawBarChart - void McuGDisplaySSD1306_DrawBarChart(McuGDisplaySSD1306_PixelDim x,... ** DrawMonoBitmap - void McuGDisplaySSD1306_DrawMonoBitmap(int16_t x, int16_t y, PIMAGE image,... ** DrawMonoBitmapMask - void McuGDisplaySSD1306_DrawMonoBitmapMask(McuGDisplaySSD1306_PixelDim x,... ** DrawColorBitmap - void McuGDisplaySSD1306_DrawColorBitmap(McuGDisplaySSD1306_PixelDim x,... ** Draw65kBitmap - void McuGDisplaySSD1306_Draw65kBitmap(McuGDisplaySSD1306_PixelDim x1,... ** Draw256BitmapLow - void McuGDisplaySSD1306_Draw256BitmapLow(McuGDisplaySSD1306_PixelDim x1,... ** Draw256BitmapHigh - void McuGDisplaySSD1306_Draw256BitmapHigh(McuGDisplaySSD1306_PixelDim x1,... ** UpdateFull - void McuGDisplaySSD1306_UpdateFull(void); ** UpdateRegion - void McuGDisplaySSD1306_UpdateRegion(McuGDisplaySSD1306_PixelDim x,... ** GetDisplayOrientation - McuGDisplaySSD1306_DisplayOrientation M... ** SetDisplayOrientation - void McuGDisplaySSD1306_SetDisplayOrien... ** GetWidth - McuGDisplaySSD1306_PixelDim McuGDisplaySSD1306_GetWidth(void); ** GetHeight - McuGDisplaySSD1306_PixelDim McuGDisplaySSD1306_GetHeight(void); ** GetLongerSide - McuGDisplaySSD1306_PixelDim McuGDisplaySSD1306_GetLongerSide(void); ** GetShorterSide - McuGDisplaySSD1306_PixelDim McuGDisplaySSD1306_GetShorterSide(void); ** GetDisplay - void McuGDisplaySSD1306_GetDisplay(void); ** GiveDisplay - void McuGDisplaySSD1306_GiveDisplay(void); ** Deinit - void McuGDisplaySSD1306_Deinit(void); ** Init - void McuGDisplaySSD1306_Init(void); ** ** * Copyright (c) 2013-2023, Erich Styger ** * Web: https://mcuoneclipse.com ** * SourceForge: https://sourceforge.net/projects/mcuoneclipse ** * Git: https://github.com/ErichStyger/McuOnEclipse_PEx ** * 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. ** ###################################################################*/ /*! ** @file McuGDisplaySSD1306.h ** @version 01.00 ** @brief ** Graphical display driver for LCD or other displays */ /*! ** @addtogroup McuGDisplaySSD1306_module McuGDisplaySSD1306 module documentation ** @{ */ /* MODULE McuGDisplaySSD1306. */ #include "McuGDisplaySSD1306.h" #if McuGDisplaySSD1306_CONFIG_USE_MUTEX #include "FreeRTOS.h" #include "semphr.h" static SemaphoreHandle_t McuGDisplaySSD1306_displayMutex; #endif static const uint16_t c332to565[256] = { /* converts a 3-3-2 RBG value into a 5-6-5 RGB value */ 0x0000, 0x000A, 0x0014, 0xF81E, 0x0120, 0x012A, 0x0134, 0xF93E, 0x0240, 0x024A, 0x0254, 0xFA5E, 0x0360, 0x036A, 0x0374, 0xFB7E, 0x0480, 0x048A, 0x0494, 0xFC9E, 0x05A0, 0x05AA, 0x05B4, 0xFDBE, 0x06C0, 0x06CA, 0x06D4, 0xFEDE, 0x07E0, 0x07EA, 0x07F4, 0xFFFE, 0x2000, 0x200A, 0x2014, 0xF81E, 0x2120, 0x212A, 0x2134, 0xF93E, 0x2240, 0x224A, 0x2254, 0xFA5E, 0x2360, 0x236A, 0x2374, 0xFB7E, 0x2480, 0x248A, 0x2494, 0xFC9E, 0x25A0, 0x25AA, 0x25B4, 0xFDBE, 0x26C0, 0x26CA, 0x26D4, 0xFEDE, 0x27E0, 0x27EA, 0x27F4, 0xFFFE, 0x4000, 0x400A, 0x4014, 0xF81E, 0x4120, 0x412A, 0x4134, 0xF93E, 0x4240, 0x424A, 0x4254, 0xFA5E, 0x4360, 0x436A, 0x4374, 0xFB7E, 0x4480, 0x448A, 0x4494, 0xFC9E, 0x45A0, 0x45AA, 0x45B4, 0xFDBE, 0x46C0, 0x46CA, 0x46D4, 0xFEDE, 0x47E0, 0x47EA, 0x47F4, 0xFFFE, 0x6000, 0x600A, 0x6014, 0xF81E, 0x6120, 0x612A, 0x6134, 0xF93E, 0x6240, 0x624A, 0x6254, 0xFA5E, 0x6360, 0x636A, 0x6374, 0xFB7E, 0x6480, 0x648A, 0x6494, 0xFC9E, 0x65A0, 0x65AA, 0x65B4, 0xFDBE, 0x66C0, 0x66CA, 0x66D4, 0xFEDE, 0x67E0, 0x67EA, 0x67F4, 0xFFFE, 0x8000, 0x800A, 0x8014, 0xF81E, 0x8120, 0x812A, 0x8134, 0xF93E, 0x8240, 0x824A, 0x8254, 0xFA5E, 0x8360, 0x836A, 0x8374, 0xFB7E, 0x8480, 0x848A, 0x8494, 0xFC9E, 0x85A0, 0x85AA, 0x85B4, 0xFDBE, 0x86C0, 0x86CA, 0x86D4, 0xFEDE, 0x87E0, 0x87EA, 0x87F4, 0xFFFE, 0xA000, 0xA00A, 0xA014, 0xF81E, 0xA120, 0xA12A, 0xA134, 0xF93E, 0xA240, 0xA24A, 0xA254, 0xFA5E, 0xA360, 0xA36A, 0xA374, 0xFB7E, 0xA480, 0xA48A, 0xA494, 0xFC9E, 0xA5A0, 0xA5AA, 0xA5B4, 0xFDBE, 0xA6C0, 0xA6CA, 0xA6D4, 0xFEDE, 0xA7E0, 0xA7EA, 0xA7F4, 0xFFFE, 0xC000, 0xC00A, 0xC014, 0xF81E, 0xC120, 0xC12A, 0xC134, 0xF93E, 0xC240, 0xC24A, 0xC254, 0xFA5E, 0xC360, 0xC36A, 0xC374, 0xFB7E, 0xC480, 0xC48A, 0xC494, 0xFC9E, 0xC5A0, 0xC5AA, 0xC5B4, 0xFDBE, 0xC6C0, 0xC6CA, 0xC6D4, 0xFEDE, 0xC7E0, 0xC7EA, 0xC7F4, 0xFFFE, 0xF800, 0xF80A, 0xF814, 0xF81E, 0xF920, 0xF92A, 0xF934, 0xF93E, 0xFA40, 0xFA4A, 0xFA54, 0xFA5E, 0xFB60, 0xFB6A, 0xFB74, 0xFB7E, 0xFC80, 0xFC8A, 0xFC94, 0xFC9E, 0xFDA0, 0xFDAA, 0xFDB4, 0xFDBE, 0xFEC0, 0xFECA, 0xFED4, 0xFEDE, 0xFFE0, 0xFFEA, 0xFFF4, 0xFFFE, }; /* ** =================================================================== ** Method : Clear (component GDisplay) ** ** Description : ** Clears the display buffer. ** Parameters : None ** Returns : Nothing ** =================================================================== */ void McuGDisplaySSD1306_Clear(void) { #if McuGDisplaySSD1306_CONFIG_USE_DOUBLE_BUFFER McuGDisplaySSD1306_CONFIG_FCT_NAME_CLEAR_BUFFER(McuGDisplaySSD1306_COLOR_PIXEL_CLR); #else McuGDisplaySSD1306_DrawFilledBox(0, 0, McuGDisplaySSD1306_GetWidth(), McuGDisplaySSD1306_GetHeight(), McuGDisplaySSD1306_COLOR_PIXEL_CLR); #endif } /* ** =================================================================== ** Method : SetPixel (component GDisplay) ** ** Description : ** Sets a pixel in the display buffer ** Parameters : ** NAME - DESCRIPTION ** x - Pixel x position ** y - Pixel y position ** Returns : Nothing ** =================================================================== */ void McuGDisplaySSD1306_SetPixel(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y) { if (x>=McuGDisplaySSD1306_GetWidth() || y>=McuGDisplaySSD1306_GetHeight()) { /* values out of range */ return; } #if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING McuGDisplaySSD1306_GetDisplay(); #endif #if McuGDisplaySSD1306_CONFIG_USE_WINDOW_CAPABILITY McuGDisplaySSD1306_CONFIG_FCT_NAME_OPENWINDOW(x, y, x, y); /* set up a one pixel window */ McuGDisplaySSD1306_CONFIG_FCT_NAME_WRITEPIXEL(McuGDisplaySSD1306_COLOR_BLACK); /* store pixel with color information */ McuGDisplaySSD1306_CONFIG_FCT_NAME_CLOSEWINDOW(); /* close and execute window */ #else McuGDisplaySSD1306_CONFIG_FCT_NAME_PUTPIXEL(x, y, McuGDisplaySSD1306_COLOR_PIXEL_SET); #endif #if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING McuGDisplaySSD1306_GiveDisplay(); #endif } /* ** =================================================================== ** Method : ClrPixel (component GDisplay) ** ** Description : ** Clears a single pixel in the display. ** Parameters : ** NAME - DESCRIPTION ** x - Pixel x position. ** y - Pixel y position. ** Returns : Nothing ** =================================================================== */ void McuGDisplaySSD1306_ClrPixel(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y) { if (x>=McuGDisplaySSD1306_GetWidth() || y>=McuGDisplaySSD1306_GetHeight()) { /* values out of range */ return; } #if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING McuGDisplaySSD1306_GetDisplay(); #endif #if McuGDisplaySSD1306_CONFIG_USE_WINDOW_CAPABILITY McuGDisplaySSD1306_CONFIG_FCT_NAME_OPENWINDOW(x, y, x, y); /* set up a one pixel window */ McuGDisplaySSD1306_CONFIG_FCT_NAME_WRITEPIXEL(McuGDisplaySSD1306_COLOR_WHITE); /* store pixel with color information */ McuGDisplaySSD1306_CONFIG_FCT_NAME_CLOSEWINDOW(); /* close and execute window */ #else McuGDisplaySSD1306_CONFIG_FCT_NAME_PUTPIXEL(x, y, McuGDisplaySSD1306_COLOR_PIXEL_CLR); #endif #if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING McuGDisplaySSD1306_GiveDisplay(); #endif } /* ** =================================================================== ** Method : UpdateFull (component GDisplay) ** ** Description : ** Updates the image on the display. This is needed in case the ** display requires a periodic refresh. For display using ** windowing, this function may be implemented as dummy stub, ** as the display content already is written. ** Parameters : None ** Returns : Nothing ** =================================================================== */ /* method is implemented as macro in header file void McuGDisplaySSD1306_UpdateFull(void) { } */ /* ** =================================================================== ** Method : PutPixel (component GDisplay) ** ** Description : ** ** Parameters : ** NAME - DESCRIPTION ** x - x coordinate ** y - y coordinate ** color - color to be used for the pixel ** Returns : Nothing ** =================================================================== */ #ifdef __HC08__ #pragma MESSAGE DISABLE C4001 /* condition always FALSE */ #endif void McuGDisplaySSD1306_PutPixel(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, McuGDisplaySSD1306_PixelColor color) { if (x>=McuGDisplaySSD1306_GetWidth() || y>=McuGDisplaySSD1306_GetHeight()) { /* values out of range */ return; } #if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING McuGDisplaySSD1306_GetDisplay(); #endif #if McuGDisplaySSD1306_CONFIG_USE_WINDOW_CAPABILITY McuGDisplaySSD1306_CONFIG_FCT_NAME_OPENWINDOW(x, y, x, y); /* set up window as large as the box */ McuGDisplaySSD1306_CONFIG_FCT_NAME_WRITEPIXEL(color); /* store pixel with color information */ McuGDisplaySSD1306_CONFIG_FCT_NAME_CLOSEWINDOW(); /* close and execute window */ #else McuGDisplaySSD1306_CONFIG_FCT_NAME_PUTPIXEL(x, y, color); #endif #if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING McuGDisplaySSD1306_GiveDisplay(); #endif } #ifdef __HC08__ #pragma MESSAGE DEFAULT C4001 /* condition always FALSE */ #endif /* ** =================================================================== ** Method : DrawFilledBox (component GDisplay) ** ** Description : ** Draws a rectangle box (filled) ** Parameters : ** NAME - DESCRIPTION ** x - x left upper coordinate ** y - y left upper coordinate ** width - Width in pixels ** height - Height in pixels ** color - color to be used to fill the box. ** Returns : Nothing ** =================================================================== */ void McuGDisplaySSD1306_DrawFilledBox(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, McuGDisplaySSD1306_PixelDim width, McuGDisplaySSD1306_PixelDim height, McuGDisplaySSD1306_PixelColor color) { #if McuGDisplaySSD1306_CONFIG_USE_WINDOW_CAPABILITY McuGDisplaySSD1306_PixelCount pixCnt; McuGDisplaySSD1306_PixelDim x1, y1; #else McuGDisplaySSD1306_PixelDim x0, xe, y0, ye; #endif McuGDisplaySSD1306_PixelDim d_width = McuGDisplaySSD1306_GetWidth(); McuGDisplaySSD1306_PixelDim d_height = McuGDisplaySSD1306_GetHeight(); if ( width==0 || height==0 || x>=d_width || y>=d_height ) { return; /* nothing to do */ } if (x+width>d_width) { /* value out of range */ if (x>=d_width) { return; /* completely outside of display */ } else { width = (McuGDisplaySSD1306_PixelDim)(d_width-x); } } if (y+height>d_height) { /* value out of range */ if (y>=d_height) { return; /* completely outside of display */ } else { height = (McuGDisplaySSD1306_PixelDim)(d_height-y); } } #if McuGDisplaySSD1306_CONFIG_USE_WINDOW_CAPABILITY x1 = (McuGDisplaySSD1306_PixelDim)(x+width-1); /* set window lower right x coordinate */ y1 = (McuGDisplaySSD1306_PixelDim)(y+height-1); /* set window lower right y coordinate */ pixCnt = (McuGDisplaySSD1306_PixelCount)((x1-x+1)*(y1-y+1)); /* number of pixels to write */ #if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING McuGDisplaySSD1306_GetDisplay(); #endif McuGDisplaySSD1306_CONFIG_FCT_NAME_OPENWINDOW(x, y, x1, y1); /* set up window as large as the box */ while (pixCnt>0) { McuGDisplaySSD1306_CONFIG_FCT_NAME_WRITEPIXEL(color); /* store pixel with color information */ pixCnt--; } /* while */ McuGDisplaySSD1306_CONFIG_FCT_NAME_CLOSEWINDOW(); /* close and execute window */ #if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING McuGDisplaySSD1306_GiveDisplay(); #endif #else y0 = y; ye = (McuGDisplaySSD1306_PixelDim)(y0+height-1); #if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING McuGDisplaySSD1306_GetDisplay(); #endif for(;;) { /* breaks */ x0 = x; xe = (McuGDisplaySSD1306_PixelDim)(x0+width-1); for(;;) { /* process line, breaks */ McuGDisplaySSD1306_PutPixel(x0, y0, color); if (x0==xe) { break; /* reached end of line */ } x0++; } /* for */ if (y0==ye) { break; /* reached end */ } y0++; } /* for */ #if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING McuGDisplaySSD1306_GiveDisplay(); #endif #endif } /* ** =================================================================== ** Method : DrawBox (component GDisplay) ** ** Description : ** Draws a rectangle line box ** Parameters : ** NAME - DESCRIPTION ** x - x left upper coordinate ** y - y left upper coordinate ** width - width in pixels ** height - height in pixels ** lineWidth - width of the line ** color - color for the box ** Returns : Nothing ** =================================================================== */ void McuGDisplaySSD1306_DrawBox(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, McuGDisplaySSD1306_PixelDim width, McuGDisplaySSD1306_PixelDim height, McuGDisplaySSD1306_PixelDim lineWidth, McuGDisplaySSD1306_PixelColor color) { /* top line: */ McuGDisplaySSD1306_DrawFilledBox(x, y, width, lineWidth, color); /* left line: */ McuGDisplaySSD1306_DrawFilledBox(x, (McuGDisplaySSD1306_PixelDim)(y+lineWidth), lineWidth, (McuGDisplaySSD1306_PixelDim)(height-(2*lineWidth)), color); /* right line: */ McuGDisplaySSD1306_DrawFilledBox((McuGDisplaySSD1306_PixelDim)(x+width-lineWidth), (McuGDisplaySSD1306_PixelDim)(y+lineWidth), lineWidth, (McuGDisplaySSD1306_PixelDim)(height-(2*lineWidth)), color); /* bottom line: */ McuGDisplaySSD1306_DrawFilledBox(x, (McuGDisplaySSD1306_PixelDim)(y+height-lineWidth), width, lineWidth, color); } /* ** =================================================================== ** Method : DrawMonoBitmap (component GDisplay) ** ** Description : ** Draws a B/W bitmap. ** Parameters : ** NAME - DESCRIPTION ** x - x position of left upper corner ** y - y position of left upper corner ** image - Pointer to image structure and ** information. ** pixelColor - Color to be used for pixels ** (pixel set) ** backgroundColor - Color to be used ** for background (pixel not set) ** Returns : Nothing ** =================================================================== */ void McuGDisplaySSD1306_DrawMonoBitmap(int16_t x, int16_t y, PIMAGE image, McuGDisplaySSD1306_PixelColor pixelColor, McuGDisplaySSD1306_PixelColor backgroundColor) { int x0, y0, xe, ye; McuGDisplaySSD1306_PixelColor pixel; uint8_t i; const uint8_t *data; data = image->pixmap; y0 = y; ye = (y+image->height-1); xe = (x+image->width-1); for(;;) { i=7; x0 = x; for(;;) { pixel = (McuGDisplaySSD1306_PixelColor)(((*data)&(1<>i); /* extract pixel out of bitstream */ if (x0>=0 && y0>=0) { /* do not write pixel if outside of display */ McuGDisplaySSD1306_PutPixel(x0, y0, (McuGDisplaySSD1306_PixelColor)(pixel==1?pixelColor:backgroundColor)); } if (i==0 && x0!=xe) { /* next byte inside the row */ data++; i = 7; } else { i--; } if (x0==xe) { /* reached end of line, next row */ data++; /* next data byte */ break; } x0++; } /* for */ if (y0==ye) break; /* reached end */ y0++; } /* for */ } /* ** =================================================================== ** Method : DrawMonoBitmapMask (component GDisplay) ** ** Description : ** Draws a B/W bitmap, but only the pixels which are set ** Parameters : ** NAME - DESCRIPTION ** x - x position of left upper corner ** y - y position of left upper corner ** image - Pointer to image structure and ** information. ** pixelColor - Color to be used for pixels ** (pixel set) ** Returns : Nothing ** =================================================================== */ void McuGDisplaySSD1306_DrawMonoBitmapMask(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, PIMAGE image, McuGDisplaySSD1306_PixelColor pixelColor) { McuGDisplaySSD1306_PixelDim x0, y0, xe, ye; McuGDisplaySSD1306_PixelColor pixel; uint8_t i; const uint8_t *data; data = image->pixmap; y0 = y; ye = (McuGDisplaySSD1306_PixelDim)(y+image->height-1); xe = (McuGDisplaySSD1306_PixelDim)(x+image->width-1); for(;;) { i=7; x0 = x; for(;;) { pixel = (McuGDisplaySSD1306_PixelColor)(((*data)&(1<>i); /* extract pixel out of bitstream */ if (pixel) { /* only draw if pixel is set, everything else is transparent */ McuGDisplaySSD1306_PutPixel(x0, y0, pixelColor); } if (i==0 && x0!=xe) { /* next byte inside the row */ data++; i = 7; } else { i--; } if (x0==xe) { /* reached end of line, next row */ data++; /* next data byte */ break; } x0++; } /* for */ if (y0==ye) break; /* reached end */ y0++; } /* for */ } /* ** =================================================================== ** Method : DrawColorBitmap (component GDisplay) ** ** Description : ** Draws a color bitmap. Pixel data is in 3-3-2 RGB format. ** Parameters : ** NAME - DESCRIPTION ** x - x position of left upper corner ** y - y position of left upper corner ** image - Pointer to image structure and ** information. ** Returns : Nothing ** =================================================================== */ void McuGDisplaySSD1306_DrawColorBitmap(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, PIMAGE image) { McuGDisplaySSD1306_PixelDim x0, y0, xe, ye; McuGDisplaySSD1306_PixelColor pixel; const uint8_t *data; data = image->pixmap; y0 = y; ye = (McuGDisplaySSD1306_PixelDim)(y+image->height-1); xe = (McuGDisplaySSD1306_PixelDim)(x+image->width-1); for(;;) { x0 = x; for(;;) { pixel = (McuGDisplaySSD1306_PixelColor)c332to565[*data]; /* extract pixel out of bitstream and convert it to our color mode*/ McuGDisplaySSD1306_PutPixel(x0, y0, pixel); data++; if (x0==xe) { /* reached end of line, next row */ break; } x0++; } /* for */ if (y0==ye) break; /* reached end */ y0++; } /* for */ } /* ** =================================================================== ** Method : DrawHLine (component GDisplay) ** ** Description : ** Draws a horizontal line ** Parameters : ** NAME - DESCRIPTION ** x - x left upper coordinate ** y - y left upper coordinate ** length - Length of line in pixels ** color - color to be used to fill the box. ** Returns : Nothing ** =================================================================== */ void McuGDisplaySSD1306_DrawHLine(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, McuGDisplaySSD1306_PixelDim length, McuGDisplaySSD1306_PixelColor color) { McuGDisplaySSD1306_DrawFilledBox(x, y, length, 1, color); } /* ** =================================================================== ** Method : DrawVLine (component GDisplay) ** ** Description : ** Draws a vertical line ** Parameters : ** NAME - DESCRIPTION ** x - x left upper coordinate ** y - y left upper coordinate ** length - Length of line in pixels ** color - color to be used to fill the box. ** Returns : Nothing ** =================================================================== */ void McuGDisplaySSD1306_DrawVLine(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, McuGDisplaySSD1306_PixelDim length, McuGDisplaySSD1306_PixelColor color) { McuGDisplaySSD1306_DrawFilledBox(x, y, 1, length, color); } /* ** =================================================================== ** Method : DrawBarChart (component GDisplay) ** ** Description : ** Draws a series of bars for a chart ** Parameters : ** NAME - DESCRIPTION ** x - upper left corner x coordinate ** y - upper left corner y coordinate ** width - Chart box width ** height - Chart box height ** * data - Pointer to data (series of % values ** from 0...100%) ** nofData - number of data bytes ** barColor - Color to be used for the bars. ** borderWidth - width of a border to be ** draw. Pass zero if there shall be no border. ** borderColor - Color to be used for the ** border (if borderWidth is not zero) ** borderSpace - Space to be used in pixels ** between border and bars. ** Returns : Nothing ** =================================================================== */ void McuGDisplaySSD1306_DrawBarChart(McuGDisplaySSD1306_PixelDim x, McuGDisplaySSD1306_PixelDim y, McuGDisplaySSD1306_PixelDim width, McuGDisplaySSD1306_PixelDim height, uint8_t *data, uint8_t nofData, McuGDisplaySSD1306_PixelColor barColor, uint8_t borderWidth, McuGDisplaySSD1306_PixelColor borderColor, uint8_t borderSpace) { uint8_t i; McuGDisplaySSD1306_PixelDim barHeight; /* for calculation of each bar height */ McuGDisplaySSD1306_PixelDim barWidth; /* bar width, based on even distribution of the bars */ if (borderWidth > 0) { /* border */ McuGDisplaySSD1306_DrawBox(x, y, width, height, borderWidth, borderColor); } /* reduce drawing area because of border */ x += borderWidth+borderSpace; y += borderWidth+borderSpace; width -= 2*(borderWidth+borderSpace); height -= 2*(borderWidth+borderSpace); /* calculat bar width based on number of bars so we fill out our drawing area */ barWidth = (McuGDisplaySSD1306_PixelDim)((width-(nofData+1)*borderSpace)/nofData); /* draw some bars */ for(i=0; i 0) { McuGDisplaySSD1306_DrawFilledBox(x, (McuGDisplaySSD1306_PixelDim)(y+height-barHeight), barWidth, barHeight, barColor); } x += barWidth+borderSpace; } } /* ** =================================================================== ** Method : DrawLine (component GDisplay) ** ** Description : ** Draws a line using the Bresenham method ** Parameters : ** NAME - DESCRIPTION ** xstart - x start coordinate ** ystart - y start coordinate ** xend - x end coordinate ** yend - y end coordinate ** color - color to be used for the line ** Returns : Nothing ** =================================================================== */ void McuGDisplaySSD1306_DrawLine(McuGDisplaySSD1306_PixelDim xstart, McuGDisplaySSD1306_PixelDim ystart, McuGDisplaySSD1306_PixelDim xend, McuGDisplaySSD1306_PixelDim yend, McuGDisplaySSD1306_PixelColor color) { /* Based on Bresenham algorithm and http://de.wikipedia.org/wiki/Bresenham-Algorithmus */ #define sgn(x) ((x) > 0) ? 1 : ((x) < 0) ? -1 : 0 McuGDisplaySSD1306_PixelDim x, y; int t, dx, dy, incx, incy, pdx, pdy, ddx, ddy, es, el, err; /* Calculate distance in both dimensions */ dx = xend - xstart; dy = yend - ystart; /* Determin sign of increment */ incx = sgn(dx); incy = sgn(dy); if(dx<0) dx = -dx; if(dy<0) dy = -dy; /* Check which distance is larger */ if (dx>dy) { /* we are faster in x direction */ pdx=incx; pdy=0; /* pd. is parallel step */ ddx=incx; ddy=incy; /* dd. is diagonal step */ es =dy; el =dx; /* error steps fast (es) and slow (el) */ } else { /* faster in y direction */ pdx=0; pdy=incy; /* pd. is parallel step */ ddx=incx; ddy=incy; /* dd. is diagonal step */ es =dx; el =dy; /* error step fast (es) and slow (el) */ } /* Do some initialization first... */ x = xstart; y = ystart; err = el/2; McuGDisplaySSD1306_PutPixel(x, y, color); /* put first pixel */ /* calculate pixels */ for(t=0; t= 0) { y--; ddF_y += 2; f += ddF_y; } x++; ddF_x += 2; f += ddF_x + 1; McuGDisplaySSD1306_PutPixel((McuGDisplaySSD1306_PixelDim)(x0 + x), (McuGDisplaySSD1306_PixelDim)(y0 + y), color); McuGDisplaySSD1306_PutPixel((McuGDisplaySSD1306_PixelDim)(x0 - x), (McuGDisplaySSD1306_PixelDim)(y0 + y), color); McuGDisplaySSD1306_PutPixel((McuGDisplaySSD1306_PixelDim)(x0 + x), (McuGDisplaySSD1306_PixelDim)(y0 - y), color); McuGDisplaySSD1306_PutPixel((McuGDisplaySSD1306_PixelDim)(x0 - x), (McuGDisplaySSD1306_PixelDim)(y0 - y), color); McuGDisplaySSD1306_PutPixel((McuGDisplaySSD1306_PixelDim)(x0 + y), (McuGDisplaySSD1306_PixelDim)(y0 + x), color); McuGDisplaySSD1306_PutPixel((McuGDisplaySSD1306_PixelDim)(x0 - y), (McuGDisplaySSD1306_PixelDim)(y0 + x), color); McuGDisplaySSD1306_PutPixel((McuGDisplaySSD1306_PixelDim)(x0 + y), (McuGDisplaySSD1306_PixelDim)(y0 - x), color); McuGDisplaySSD1306_PutPixel((McuGDisplaySSD1306_PixelDim)(x0 - y), (McuGDisplaySSD1306_PixelDim)(y0 - x), color); } } /* ** =================================================================== ** Method : DrawFilledCircle (component GDisplay) ** ** Description : ** Draws a circle using the Bresenham method ** Parameters : ** NAME - DESCRIPTION ** x0 - x start coordinate ** y0 - y start coordinate ** radius - Radius of the circle ** color - fill color to be used ** Returns : Nothing ** =================================================================== */ void McuGDisplaySSD1306_DrawFilledCircle(McuGDisplaySSD1306_PixelDim x0, McuGDisplaySSD1306_PixelDim y0, McuGDisplaySSD1306_PixelDim radius, McuGDisplaySSD1306_PixelColor color) { /* draw a circle using the Bresenham method, see http://de.wikipedia.org/wiki/Bresenham-Algorithmus and http://forums.tigsource.com/index.php?topic=17068.0;wap2 */ McuGDisplaySSD1306_PixelDim xoff=0; McuGDisplaySSD1306_PixelDim yoff=radius; int balance=-((int)radius); McuGDisplaySSD1306_PixelDim p0, p1, w0, w1; while (xoff <= yoff) { p0 = (McuGDisplaySSD1306_PixelDim)(x0-xoff); p1 = (McuGDisplaySSD1306_PixelDim)(x0-yoff); w0 = (McuGDisplaySSD1306_PixelDim)(2*xoff); w1 = (McuGDisplaySSD1306_PixelDim)(2*yoff); McuGDisplaySSD1306_DrawHLine(p0, (McuGDisplaySSD1306_PixelDim)(y0+yoff), w0, color); McuGDisplaySSD1306_DrawHLine(p0, (McuGDisplaySSD1306_PixelDim)(y0-yoff), w0, color); McuGDisplaySSD1306_DrawHLine(p1, (McuGDisplaySSD1306_PixelDim)(y0+xoff), w1, color); McuGDisplaySSD1306_DrawHLine(p1, (McuGDisplaySSD1306_PixelDim)(y0-xoff), w1, color); balance += 2*xoff; xoff++; if (balance>=0) { yoff--; balance -= 2*yoff; } } /* while */ } /* ** =================================================================== ** Method : Draw65kBitmap (component GDisplay) ** ** Description : ** Draws a 65k color bitmap (compressed or uncompressed) ** Parameters : ** NAME - DESCRIPTION ** x1 - left upper starting corner ** y1 - left upper starting corner ** x2 - right lower corner ** y2 - right lower corner ** * bmp - Pointer to bitmap ** compressed - ** Returns : Nothing ** =================================================================== */ void McuGDisplaySSD1306_Draw65kBitmap(McuGDisplaySSD1306_PixelDim x1, McuGDisplaySSD1306_PixelDim y1, McuGDisplaySSD1306_PixelDim x2, McuGDisplaySSD1306_PixelDim y2, uint16_t *bmp, bool compressed) { #if McuGDisplaySSD1306_CONFIG_USE_WINDOW_CAPABILITY McuGDisplaySSD1306_PixelCount pixelCount = (McuGDisplaySSD1306_PixelCount)((x2-x1+1) * (y2-y1+1)); #endif #if McuGDisplaySSD1306_CONFIG_USE_DISPLAY_SHARING McuGDisplaySSD1306_GetDisplay(); #endif #if McuGDisplaySSD1306_CONFIG_USE_WINDOW_CAPABILITY McuGDisplaySSD1306_CONFIG_FCT_NAME_OPENWINDOW(x1, y1, x2, y2); /* set up window as large as the box */ if (compressed) { McuGDisplaySSD1306_PixelColor PixelColor = 0; uint16_t Pos = 0; bool FirstRead = TRUE; uint16_t i; uint16_t Repeat; for (i=0; i