]> git.donarmstrong.com Git - kiibohd-controller.git/commitdiff
Adding example logo to the lcdtest and bmp conversion script.
authorJacob Alexander <haata@kiibohd.com>
Sat, 18 Apr 2015 18:24:15 +0000 (11:24 -0700)
committerJacob Alexander <haata@kiibohd.com>
Sun, 14 Jun 2015 21:33:39 +0000 (14:33 -0700)
Scan/STLcd/bitmap2Struct.py [new file with mode: 0755]
Scan/STLcd/ic_logo_lcd.bmp [new file with mode: 0644]
Scan/STLcd/lcd_scan.c

diff --git a/Scan/STLcd/bitmap2Struct.py b/Scan/STLcd/bitmap2Struct.py
new file mode 100755 (executable)
index 0000000..dcf30c6
--- /dev/null
@@ -0,0 +1,195 @@
+#!/usr/bin/env python3
+
+# Copyright (C) 2015 by Jacob Alexander
+#
+# This file is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this file.  If not, see <http://www.gnu.org/licenses/>.
+
+# Imports
+import sys
+
+from array import *
+from PIL import Image
+
+
+# Convenience class to deal with converting images to a C array
+class STLcdGraphic:
+       # Some constants for the LCD Driver
+       page_width = 8
+       page_max_length = 132
+
+       array('B')
+
+       def __init__( self, height, width ):
+               self.height = height
+               self.width  = width
+
+               # Calculate number of pages
+               self.page_count  = int( self.height / self.page_width )
+               self.page_length = self.width
+
+               # Initialize pages to 0's
+               self.page_data = []
+               for page in range( 0, self.page_count ):
+                       self.page_data.append( array( 'B', [0] * self.page_length ) )
+
+       def setpixel( self, x, y ):
+               # Calculate which page
+               page = int( ( self.height - y ) / self.page_width )
+
+               if page == 4:
+                       print("YAR", (x,y))
+
+               # Calculate which byte
+               byte = x
+
+               # Calculate which bit
+               bit = int( ( self.height - y ) % self.page_width )
+
+               # Set pixel bit
+               self.page_data[ page ][ byte ] |= (1 << bit)
+
+       def getpage( self, page ):
+               return self.page_data[ page ]
+
+       def getarray( self ):
+               struct = "{\n"
+
+               for page in range( 0, self.page_count ):
+                       for elem in self.page_data[ page ]:
+                               struct += "0x{0:02x}, ".format( elem )
+
+                       if page != self.page_count - 1:
+                               struct += "\n"
+
+               struct += "\n}"
+
+               return struct
+
+       # Prints out what the image will look like on the display
+       def preview( self ):
+               # Top border first
+               display = "+"
+               for pixel in range( 0, self.width ):
+                       display += "-"
+               display += "+\n"
+
+               # Each Page
+               for page in range( self.page_count - 1, -1, -1 ):
+                       # Each Bit (Line)
+                       for line in range( 7, -1, -1 ):
+                               # Border
+                               display += "|"
+
+                               # Each Byte (Column/Pixel)
+                               for byte in range( 0, self.width ):
+                                       if self.page_data[ page ][ byte ] & (1 << line):
+                                               display += "*"
+                                       else:
+                                               display += " "
+
+                               # Border
+                               display += "|\n"
+
+               # Bottom border
+               display += "+"
+               for pixel in range( 0, self.width ):
+                       display += "-"
+               display += "+\n"
+
+               return display
+
+
+filename = "ic_logo_lcd.bmp"
+max_height = 32
+max_width = 128
+x_offset = 0
+y_offset = 0
+output_image = STLcdGraphic( max_height, max_width )
+
+
+
+# Load the input filename and convert to black & white
+try:
+       input_image = Image.open( filename ).convert('1')
+except:
+       print( "Unable to load image '{0}'".format( filename ) )
+
+# Check the image size to see if within the bounds of the display
+if input_image.size[0] > max_width or input_image.size[1] > max_height:
+       print( "ERROR: '{0}:{1}' is too large, must be no larger than {2}x{3}".format(
+               filename,
+               ( input_image.format, input_image.size, input_image.mode ),
+               max_width,
+               max_height )
+       )
+       sys.exit( 1 )
+
+# Center the image
+height_start = int( ( max_height - input_image.size[1] ) / 2 )
+height_end   = int( height_start + input_image.size[1] )
+width_start  = int( ( max_width - input_image.size[0] ) / 2 )
+width_end    = int( width_start + input_image.size[0] )
+
+#print( height_start )
+#print( height_end )
+#print( width_start )
+#print( width_end )
+
+# Iterate over all of the pixels
+# Also prepare the debug view of the image (disp_test)
+disp_test = "+"
+for pixel in range( 0, max_width ):
+       disp_test += "-"
+disp_test += "+\n"
+
+for y in range( 0, max_height ):
+       disp_test += "|"
+
+       # Check if within height range
+       if not ( y >= height_start and y < height_end ):
+               disp_test += " " * max_width + "|\n|"
+               continue
+
+       for x in range( 0, max_width ):
+               # Check if within width range
+               if not ( x >= width_start and x < width_end ):
+                       disp_test += " "
+                       continue
+
+               # Use image value to determine pixel
+               try:
+                       if input_image.getpixel( (x - width_start, y - height_start) ) == 0:
+                               disp_test += "*"
+                               output_image.setpixel( x, y + 1 ) # +1 is due to page boundary
+                       else:
+                               disp_test += " "
+               except IndexError:
+                       print( (x - width_start,y - height_start) )
+                       pass
+
+       disp_test += "|\n"
+
+disp_test += "+"
+for pixel in range( 0, max_width ):
+       disp_test += "-"
+disp_test += "+\n"
+
+# BMP Conversion preview
+print( disp_test )
+
+
+print ( output_image.preview() )
+#print ()
+print( "uint8_t array[] = {0};".format( output_image.getarray() ) )
+
diff --git a/Scan/STLcd/ic_logo_lcd.bmp b/Scan/STLcd/ic_logo_lcd.bmp
new file mode 100644 (file)
index 0000000..0682013
Binary files /dev/null and b/Scan/STLcd/ic_logo_lcd.bmp differ
index 5cc7c89a5297b871a6b49dd3cf12599a4950bd18..b5123c97334d5082515cc932876867b06b91192d 100644 (file)
@@ -32,7 +32,7 @@
 // ----- Defines -----
 
 #define LCD_TOTAL_VISIBLE_PAGES 4
-#define LCD_PAGE_LEN 132
+#define LCD_PAGE_LEN 128
 
 
 
@@ -158,6 +158,13 @@ void LCD_writeDisplayReg( uint8_t page, uint8_t *buffer, uint8_t len )
        // Set the register page
        LCD_writeControlReg( 0xB0 | ( 0x0F & page ) );
 
+       // Set display start line
+       LCD_writeControlReg( 0x40 );
+
+       // Reset Column Address
+       LCD_writeControlReg( 0x10 );
+       LCD_writeControlReg( 0x00 );
+
        // Write buffer to SPI
        SPI_write( buffer, len );
 }
@@ -295,10 +302,23 @@ void cliFunc_lcdTest( char* args )
        //LCD_initialize();
        // Test pattern
        uint8_t pattern[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
+
+
+uint8_t logo[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
        //uint8_t pattern[] = { 0xFF, 0x00, 0x96, 0xFF, 0x00, 0xFF, 0x00 };
 
        // Write to page D0
-       LCD_writeDisplayReg( 0, pattern, sizeof( pattern ) );
+       //LCD_writeDisplayReg( 0, pattern, sizeof( pattern ) );
+
+       for ( uint8_t page = 0; page < LCD_TOTAL_VISIBLE_PAGES; page++ )
+       {
+               LCD_writeDisplayReg( page, &logo[page * LCD_PAGE_LEN], LCD_PAGE_LEN );
+       }
 }
 
 void cliFunc_lcdCmd( char* args )