From 7be3f9c0af61b18140268f5cdbb72f8a29466688 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartosz=20Ko=C5=9Bci=C3=B3w?= Date: Sat, 8 Jul 2017 19:43:38 +0200 Subject: [PATCH 1/4] refactor colors add tests --- gfxlcd/abstract/chip.py | 17 +- gfxlcd/demos/ili9325_hd44780.py | 8 +- gfxlcd/drawing/area.py | 17 +- gfxlcd/drawing/page.py | 6 +- gfxlcd/drawing/pixel.py | 10 +- gfxlcd/driver/hd44780.py | 6 +- gfxlcd/driver/ili9325/ili9325.py | 30 ++- gfxlcd/driver/ili9486/ili9486.py | 30 ++- gfxlcd/driver/nju6450/nju6450.py | 17 +- gfxlcd/driver/null/null_area.py | 10 +- gfxlcd/driver/null/null_page.py | 9 +- gfxlcd/driver/ssd1306/ssd1306.py | 17 +- gfxlcd/tests/test_area_drawing.py | 341 +++++++++++++++--------------- gfxlcd/tests/test_ili9325.py | 13 ++ gfxlcd/tests/test_ili9486.py | 10 + gfxlcd/tests/test_nju6450.py | 11 + gfxlcd/tests/test_ssd1306.py | 10 + 17 files changed, 327 insertions(+), 235 deletions(-) create mode 100644 gfxlcd/tests/test_ili9325.py create mode 100644 gfxlcd/tests/test_ili9486.py create mode 100644 gfxlcd/tests/test_nju6450.py create mode 100644 gfxlcd/tests/test_ssd1306.py diff --git a/gfxlcd/abstract/chip.py b/gfxlcd/abstract/chip.py index 9ddda43..fd8c55a 100644 --- a/gfxlcd/abstract/chip.py +++ b/gfxlcd/abstract/chip.py @@ -30,14 +30,19 @@ class Chip(metaclass=abc.ABCMeta): else: return self._width - @abc.abstractmethod - def _converted_background_color(self): - """convert RGB background to available color""" - pass + # @abc.abstractmethod + # def _converted_background_color(self): + # """convert RGB background to available color""" + # pass + # + # @abc.abstractmethod + # def _converted_color(self): + # """convert RGB color to available color""" + # pass @abc.abstractmethod - def _converted_color(self): - """convert RGB color to available color""" + def _convert_color(self, color): + """convert color to avaible one""" pass @property diff --git a/gfxlcd/demos/ili9325_hd44780.py b/gfxlcd/demos/ili9325_hd44780.py index 99bf905..4553aff 100644 --- a/gfxlcd/demos/ili9325_hd44780.py +++ b/gfxlcd/demos/ili9325_hd44780.py @@ -21,8 +21,12 @@ def test1(): lcd = CharLCD(drv.width, drv.height, drv, 0, 0) lcd.init() - lcd.write('-!Second blarg!') - lcd.write("-second line", 0, 1) + lcd.write('First Line') + lcd.write("This text is displayed", 2, 18) + lcd.write("via CharLCD package", 10, 20) + lcd.write('GfxLCD uses driver', 1, 22) + lcd.write('to be compatible with', 9, 24) + lcd.write('HD44780', 10, 26) lcd.flush() lcd.write('/* ', 19, 0) diff --git a/gfxlcd/drawing/area.py b/gfxlcd/drawing/area.py index c2ab129..de4fae8 100644 --- a/gfxlcd/drawing/area.py +++ b/gfxlcd/drawing/area.py @@ -13,22 +13,24 @@ class Area(Pixel): """additional initialization""" pass - def draw_pixel(self, pos_x, pos_y): + def draw_pixel(self, pos_x, pos_y, color=None): """draw one pixel""" + if color is None: + color = self.options['color'] self._set_area(pos_x, pos_y, pos_x, pos_y) - self.driver.data(self._converted_color(), None) + self.driver.data(self._convert_color(color), None) def _draw_vertical_line(self, pos_x, pos_y, length): """draw vertical line""" self._set_area(pos_x, pos_y, pos_x, pos_y + length) - color = self._converted_color() + color = self._convert_color(self.options['color']) for _ in itertools.repeat(None, length): self.driver.data(color, None) def _draw_horizontal_line(self, pos_x, pos_y, length): """draw horizontal line""" self._set_area(pos_x, pos_y, pos_x + length, pos_y) - color = self._converted_color() + color = self._convert_color(self.options['color']) for _ in itertools.repeat(None, length): self.driver.data(color, None) @@ -94,7 +96,8 @@ class Area(Pixel): max(pos_x1, pos_x2), max(pos_y1, pos_y2) ) - color = self._converted_background_color() + # color = self._converted_background_color() + color = self._convert_color(self.options['background_color']) for _ in range(0, size): self.driver.data(color, None) @@ -131,7 +134,9 @@ class Area(Pixel): self._set_area(*temporary_area) temporary_area = None self.color = (red, green, blue) - self.driver.data(self._converted_color(), None) + self.driver.data( + self._convert_color(self.options['color']), None + ) col += 1 if col > width - 1: diff --git a/gfxlcd/drawing/page.py b/gfxlcd/drawing/page.py index 0dd964c..17d93d5 100644 --- a/gfxlcd/drawing/page.py +++ b/gfxlcd/drawing/page.py @@ -16,9 +16,11 @@ class Page(Pixel, metaclass=abc.ABCMeta): else: self.buffer = [[0] * (self.width // 8) for x in range(self.height)] - def draw_pixel(self, pos_x, pos_y): + def draw_pixel(self, pos_x, pos_y, color=None): """draw a pixel at x,y""" - self.buffer[pos_x][pos_y//8] |= 1 << (pos_y % 8) + if color is None: + color = self.options['color'] + self.buffer[pos_x][pos_y//8] |= self._convert_color(color) << (pos_y % 8) self.flush() def draw_line(self, pos_x1, pos_y1, pos_x2, pos_y2): diff --git a/gfxlcd/drawing/pixel.py b/gfxlcd/drawing/pixel.py index bb70a9e..209ad3f 100644 --- a/gfxlcd/drawing/pixel.py +++ b/gfxlcd/drawing/pixel.py @@ -36,7 +36,7 @@ class Pixel(object): """set transparency color """ self.options['transparency_color'] = transparency_color - def draw_pixel(self, pos_x, pos_y): + def draw_pixel(self, pos_x, pos_y, color=None): """dummy function""" pass @@ -137,15 +137,15 @@ class Pixel(object): return appendix - def draw_text(self, pos_x, pos_y, text): + def draw_text(self, pos_x, pos_y, text, with_background=False): """draw a text""" font = self.options['font'] idx = 0 for letter in text: - self._draw_letter(pos_x + idx, pos_y, letter) + self._draw_letter(pos_x + idx, pos_y, letter, with_background) idx += font.size[0] - def _draw_letter(self, pos_x, pos_y, letter): + def _draw_letter(self, pos_x, pos_y, letter, with_background=False): """draw a letter""" font = self.options['font'] bits = font.size[0] @@ -153,5 +153,7 @@ class Pixel(object): for bit in range(bits): if data & 0x01: self.draw_pixel(pos_x + bit, pos_y + row) + elif with_background: + self.draw_pixel(pos_x + bit, pos_y + row) data >>= 1 diff --git a/gfxlcd/driver/hd44780.py b/gfxlcd/driver/hd44780.py index 1599a31..7423805 100644 --- a/gfxlcd/driver/hd44780.py +++ b/gfxlcd/driver/hd44780.py @@ -21,14 +21,14 @@ class HD44780(BaseDriver): 'x': 0, 'y': 0 } + self.address = [] def init(self): """init function""" if self.initialized: return - char_lcd.LCD_LINES = [] for address in range(self.height): - char_lcd.LCD_LINES.append(100 + (address * self.width)) + self.address.append(100 + (address * self.width)) self.gfxlcd.init() self.initialized = True @@ -71,3 +71,5 @@ class HD44780(BaseDriver): def _increase_x(self): self.position['x'] += self.font.size[0] + def get_line_address(self, idx): + return self.address[idx] diff --git a/gfxlcd/driver/ili9325/ili9325.py b/gfxlcd/driver/ili9325/ili9325.py index cf37742..1bdd5fb 100644 --- a/gfxlcd/driver/ili9325/ili9325.py +++ b/gfxlcd/driver/ili9325/ili9325.py @@ -33,19 +33,27 @@ class ILI9325(Area, Chip): Chip.__init__(self, width, height, driver, True) Area.__init__(self, driver) - def _converted_background_color(self): - """color from 8-8-8 to 5-6-5""" - rgb = self.options['background_color']['R'] << 16 | \ - self.options['background_color']['G'] << 8 | \ - self.options['background_color']['B'] - return ((rgb & 0x00f80000) >> 8) |\ - ((rgb & 0x0000fc00) >> 5) | ((rgb & 0x000000f8) >> 3) + # def _converted_background_color(self): + # """color from 8-8-8 to 5-6-5""" + # rgb = self.options['background_color']['R'] << 16 | \ + # self.options['background_color']['G'] << 8 | \ + # self.options['background_color']['B'] + # return ((rgb & 0x00f80000) >> 8) |\ + # ((rgb & 0x0000fc00) >> 5) | ((rgb & 0x000000f8) >> 3) + # + # def _converted_color(self): + # """color from 8-8-8 to 5-6-5""" + # rgb = self.options['color']['R'] << 16 | \ + # self.options['color']['G'] << 8 | \ + # self.options['color']['B'] + # return ((rgb & 0x00f80000) >> 8) |\ + # ((rgb & 0x0000fc00) >> 5) | ((rgb & 0x000000f8) >> 3) - def _converted_color(self): + def _convert_color(self, color): """color from 8-8-8 to 5-6-5""" - rgb = self.options['color']['R'] << 16 | \ - self.options['color']['G'] << 8 | \ - self.options['color']['B'] + rgb = color['R'] << 16 | \ + color['G'] << 8 | \ + color['B'] return ((rgb & 0x00f80000) >> 8) |\ ((rgb & 0x0000fc00) >> 5) | ((rgb & 0x000000f8) >> 3) diff --git a/gfxlcd/driver/ili9486/ili9486.py b/gfxlcd/driver/ili9486/ili9486.py index cdcafb6..b32843b 100644 --- a/gfxlcd/driver/ili9486/ili9486.py +++ b/gfxlcd/driver/ili9486/ili9486.py @@ -12,19 +12,27 @@ class ILI9486(Area, Chip): Chip.__init__(self, width, height, driver, True) Area.__init__(self, driver) - def _converted_background_color(self): - """color from 8-8-8 to 5-6-5""" - rgb = self.options['background_color']['R'] << 16 | \ - self.options['background_color']['G'] << 8 | \ - self.options['background_color']['B'] - return ((rgb & 0x00f80000) >> 8) |\ - ((rgb & 0x0000fc00) >> 5) | ((rgb & 0x000000f8) >> 3) + # def _converted_background_color(self): + # """color from 8-8-8 to 5-6-5""" + # rgb = self.options['background_color']['R'] << 16 | \ + # self.options['background_color']['G'] << 8 | \ + # self.options['background_color']['B'] + # return ((rgb & 0x00f80000) >> 8) |\ + # ((rgb & 0x0000fc00) >> 5) | ((rgb & 0x000000f8) >> 3) + # + # def _converted_color(self): + # """color from 8-8-8 to 5-6-5""" + # rgb = self.options['color']['R'] << 16 | \ + # self.options['color']['G'] << 8 | \ + # self.options['color']['B'] + # return ((rgb & 0x00f80000) >> 8) |\ + # ((rgb & 0x0000fc00) >> 5) | ((rgb & 0x000000f8) >> 3) - def _converted_color(self): + def _convert_color(self, color): """color from 8-8-8 to 5-6-5""" - rgb = self.options['color']['R'] << 16 | \ - self.options['color']['G'] << 8 | \ - self.options['color']['B'] + rgb = color['R'] << 16 | \ + color['G'] << 8 | \ + color['B'] return ((rgb & 0x00f80000) >> 8) |\ ((rgb & 0x0000fc00) >> 5) | ((rgb & 0x000000f8) >> 3) diff --git a/gfxlcd/driver/nju6450/nju6450.py b/gfxlcd/driver/nju6450/nju6450.py index ad6a05f..e4be7e1 100644 --- a/gfxlcd/driver/nju6450/nju6450.py +++ b/gfxlcd/driver/nju6450/nju6450.py @@ -36,12 +36,19 @@ class NJU6450(Page, Chip): self.driver.cmd(0xB8 | pos_y, 1) self.driver.cmd(0x00 | (pos_x - width//2), 1) - def _converted_background_color(self): - """convert RGB background to available color""" - return 1 + # def _converted_background_color(self): + # """convert RGB background to available color""" + # return 1 + # + # def _converted_color(self): + # """convert RGB color to available color""" + # return 1 + + def _convert_color(self, color): + """convert color to avaiable one""" + if color['R'] == 0 and color['G'] == 0 and color['B'] == 0: + return 0 - def _converted_color(self): - """convert RGB color to available color""" return 1 def flush(self, force=None): diff --git a/gfxlcd/driver/null/null_area.py b/gfxlcd/driver/null/null_area.py index dfd1ca6..cf17736 100644 --- a/gfxlcd/driver/null/null_area.py +++ b/gfxlcd/driver/null/null_area.py @@ -10,13 +10,9 @@ class NullArea(Area, Chip): Area.__init__(self, driver) self.rotation = 0 - def _converted_background_color(self): - """dummy background color""" - return 2 - - def _converted_color(self): - """dummy color""" - return 1 + def _convert_color(self, color): + """color color""" + return color def init(self): """init display""" diff --git a/gfxlcd/driver/null/null_page.py b/gfxlcd/driver/null/null_page.py index dbf83c4..05ebef1 100644 --- a/gfxlcd/driver/null/null_page.py +++ b/gfxlcd/driver/null/null_page.py @@ -22,12 +22,11 @@ class NullPage(Page, Chip): Page.init(self) Chip.init(self) - def _converted_background_color(self): - """convert RGB background to available color""" - return 1 + def _convert_color(self, color): + """convert color to avaiable one""" + if color['R'] == 0 and color['G'] == 0 and color['B'] == 0: + return 0 - def _converted_color(self): - """convert RGB color to available color""" return 1 def flush(self, force=None): diff --git a/gfxlcd/driver/ssd1306/ssd1306.py b/gfxlcd/driver/ssd1306/ssd1306.py index edb11b4..a5b40dd 100644 --- a/gfxlcd/driver/ssd1306/ssd1306.py +++ b/gfxlcd/driver/ssd1306/ssd1306.py @@ -76,12 +76,19 @@ class SSD1306(Page, Chip): self.driver.cmd(0x14) # enable charge pump self.driver.cmd(0xaf) # turn on panel - def _converted_background_color(self): - """convert RGB background to available color""" - return 1 + # def _converted_background_color(self): + # """convert RGB background to available color""" + # return 1 + # + # def _converted_color(self): + # """convert RGB color to available color""" + # return 1 + + def _convert_color(self, color): + """convert color to avaiable one""" + if color['R'] == 0 and color['G'] == 0 and color['B'] == 0: + return 0 - def _converted_color(self): - """convert RGB color to available color""" return 1 def flush(self, force=None): diff --git a/gfxlcd/tests/test_area_drawing.py b/gfxlcd/tests/test_area_drawing.py index 8b37f5b..eb08435 100644 --- a/gfxlcd/tests/test_area_drawing.py +++ b/gfxlcd/tests/test_area_drawing.py @@ -5,7 +5,10 @@ from gfxlcd.driver.null.null_area import NullArea from gfxlcd.driver.null.area_driver import AreaDriver -class TestPageDrawing(object): +class TestAreaDrawing(object): + color_black = {'R': 0, 'G': 0, 'B': 0} + color_white = {'R': 255, 'G': 255, 'B':255} + def setUp(self): self.drv = AreaDriver(10, 16) self.lcd = NullArea(10, 16, self.drv, False) @@ -24,189 +27,189 @@ class TestPageDrawing(object): def test_draw_pixel(self): self.lcd.draw_pixel(1, 1) buffer = self.get_buffer() - buffer[1][1] = 1 + buffer[1][1] = self.color_white assert_equal(self.drv.buffer, buffer) def test_draw_two_pixel(self): self.lcd.draw_pixel(1, 1) self.lcd.draw_pixel(2, 2) buffer = self.get_buffer() - buffer[1][1] = 1 - buffer[2][2] = 1 + buffer[1][1] = self.color_white + buffer[2][2] = self.color_white assert_equal(self.drv.buffer, buffer) def test_draw_horizontal_line(self): self.lcd.draw_line(1, 1, 8, 1) buffer = self.get_buffer() - buffer[1][1] = 1 - buffer[2][1] = 1 - buffer[3][1] = 1 - buffer[4][1] = 1 - buffer[5][1] = 1 - buffer[6][1] = 1 - buffer[7][1] = 1 - buffer[8][1] = 1 + buffer[1][1] = self.color_white + buffer[2][1] = self.color_white + buffer[3][1] = self.color_white + buffer[4][1] = self.color_white + buffer[5][1] = self.color_white + buffer[6][1] = self.color_white + buffer[7][1] = self.color_white + buffer[8][1] = self.color_white assert_equal(self.drv.buffer, buffer) def test_draw_vertical_line(self): self.lcd.draw_line(1, 1, 1, 14) buffer = self.get_buffer() - buffer[1][1] = 1 - buffer[1][2] = 1 - buffer[1][3] = 1 - buffer[1][4] = 1 - buffer[1][5] = 1 - buffer[1][6] = 1 - buffer[1][7] = 1 - buffer[1][8] = 1 - buffer[1][9] = 1 - buffer[1][10] = 1 - buffer[1][11] = 1 - buffer[1][12] = 1 - buffer[1][13] = 1 - buffer[1][14] = 1 + buffer[1][1] = self.color_white + buffer[1][2] = self.color_white + buffer[1][3] = self.color_white + buffer[1][4] = self.color_white + buffer[1][5] = self.color_white + buffer[1][6] = self.color_white + buffer[1][7] = self.color_white + buffer[1][8] = self.color_white + buffer[1][9] = self.color_white + buffer[1][10] = self.color_white + buffer[1][11] = self.color_white + buffer[1][12] = self.color_white + buffer[1][13] = self.color_white + buffer[1][14] = self.color_white assert_equal(self.drv.buffer, buffer) def test_draw_overlapping_lines(self): self.lcd.draw_line(1, 1, 8, 1) self.lcd.draw_line(1, 1, 1, 14) buffer = self.get_buffer() - buffer[1][1] = 1 - buffer[2][1] = 1 - buffer[3][1] = 1 - buffer[4][1] = 1 - buffer[5][1] = 1 - buffer[6][1] = 1 - buffer[7][1] = 1 - buffer[8][1] = 1 - buffer[1][1] = 1 - buffer[1][2] = 1 - buffer[1][3] = 1 - buffer[1][4] = 1 - buffer[1][5] = 1 - buffer[1][6] = 1 - buffer[1][7] = 1 - buffer[1][8] = 1 - buffer[1][9] = 1 - buffer[1][10] = 1 - buffer[1][11] = 1 - buffer[1][12] = 1 - buffer[1][13] = 1 - buffer[1][14] = 1 + buffer[1][1] = self.color_white + buffer[2][1] = self.color_white + buffer[3][1] = self.color_white + buffer[4][1] = self.color_white + buffer[5][1] = self.color_white + buffer[6][1] = self.color_white + buffer[7][1] = self.color_white + buffer[8][1] = self.color_white + buffer[1][1] = self.color_white + buffer[1][2] = self.color_white + buffer[1][3] = self.color_white + buffer[1][4] = self.color_white + buffer[1][5] = self.color_white + buffer[1][6] = self.color_white + buffer[1][7] = self.color_white + buffer[1][8] = self.color_white + buffer[1][9] = self.color_white + buffer[1][10] = self.color_white + buffer[1][11] = self.color_white + buffer[1][12] = self.color_white + buffer[1][13] = self.color_white + buffer[1][14] = self.color_white assert_equal(self.drv.buffer, buffer) def test_draw_diagonal_line(self): self.lcd.draw_line(0, 0, 9, 1) buffer = self.get_buffer() - buffer[0][0] = 1 - buffer[1][0] = 1 - buffer[2][0] = 1 - buffer[3][0] = 1 - buffer[4][0] = 1 - buffer[5][1] = 1 - buffer[6][1] = 1 - buffer[7][1] = 1 - buffer[8][1] = 1 - buffer[9][1] = 1 + buffer[0][0] = self.color_white + buffer[1][0] = self.color_white + buffer[2][0] = self.color_white + buffer[3][0] = self.color_white + buffer[4][0] = self.color_white + buffer[5][1] = self.color_white + buffer[6][1] = self.color_white + buffer[7][1] = self.color_white + buffer[8][1] = self.color_white + buffer[9][1] = self.color_white assert_equal(self.drv.buffer, buffer) def test_draw_diagonal_line_even_steps(self): self.lcd.draw_line(0, 0, 9, 15) buffer = self.get_buffer() - buffer[0][0] = 1 - buffer[1][1] = 1 - buffer[2][2] = 1 - buffer[2][3] = 1 - buffer[3][4] = 1 - buffer[3][5] = 1 - buffer[4][6] = 1 - buffer[4][7] = 1 - buffer[5][8] = 1 - buffer[5][9] = 1 - buffer[6][10] = 1 - buffer[6][11] = 1 - buffer[7][12] = 1 - buffer[7][13] = 1 - buffer[8][14] = 1 - buffer[9][15] = 1 + buffer[0][0] = self.color_white + buffer[1][1] = self.color_white + buffer[2][2] = self.color_white + buffer[2][3] = self.color_white + buffer[3][4] = self.color_white + buffer[3][5] = self.color_white + buffer[4][6] = self.color_white + buffer[4][7] = self.color_white + buffer[5][8] = self.color_white + buffer[5][9] = self.color_white + buffer[6][10] = self.color_white + buffer[6][11] = self.color_white + buffer[7][12] = self.color_white + buffer[7][13] = self.color_white + buffer[8][14] = self.color_white + buffer[9][15] = self.color_white assert_equal(self.drv.buffer, buffer) def test_draw_diagonal_line_even_steps_even_rest(self): self.lcd.draw_line(0, 0, 9, 5) buffer = self.get_buffer() - buffer[0][0] = 1 - buffer[1][1] = 1 - buffer[2][1] = 1 - buffer[3][2] = 1 - buffer[4][2] = 1 - buffer[5][3] = 1 - buffer[6][3] = 1 - buffer[7][4] = 1 - buffer[8][4] = 1 - buffer[9][5] = 1 + buffer[0][0] = self.color_white + buffer[1][1] = self.color_white + buffer[2][1] = self.color_white + buffer[3][2] = self.color_white + buffer[4][2] = self.color_white + buffer[5][3] = self.color_white + buffer[6][3] = self.color_white + buffer[7][4] = self.color_white + buffer[8][4] = self.color_white + buffer[9][5] = self.color_white assert_equal(self.drv.buffer, buffer) def test_draw_diagonal_line_odd_steps_even_rest(self): self.lcd.draw_line(0, 0, 9, 6) buffer = self.get_buffer() - buffer[0][0] = 1 - buffer[1][1] = 1 - buffer[2][2] = 1 - buffer[3][2] = 1 - buffer[4][3] = 1 - buffer[5][3] = 1 - buffer[6][4] = 1 - buffer[7][4] = 1 - buffer[8][5] = 1 - buffer[9][6] = 1 + buffer[0][0] = self.color_white + buffer[1][1] = self.color_white + buffer[2][2] = self.color_white + buffer[3][2] = self.color_white + buffer[4][3] = self.color_white + buffer[5][3] = self.color_white + buffer[6][4] = self.color_white + buffer[7][4] = self.color_white + buffer[8][5] = self.color_white + buffer[9][6] = self.color_white assert_equal(self.drv.buffer, buffer) def test_draw_diagonal_line_even_steps_odd_rest(self): self.lcd.draw_line(0, 0, 8, 6) buffer = self.get_buffer() - buffer[0][0] = 1 - buffer[1][1] = 1 - buffer[2][2] = 1 - buffer[3][3] = 1 - buffer[4][3] = 1 - buffer[5][3] = 1 - buffer[6][4] = 1 - buffer[7][5] = 1 - buffer[8][6] = 1 + buffer[0][0] = self.color_white + buffer[1][1] = self.color_white + buffer[2][2] = self.color_white + buffer[3][3] = self.color_white + buffer[4][3] = self.color_white + buffer[5][3] = self.color_white + buffer[6][4] = self.color_white + buffer[7][5] = self.color_white + buffer[8][6] = self.color_white assert_equal(self.drv.buffer, buffer) def test_draw_rect(self): self.lcd.draw_rect(2, 2, 7, 11) buffer = self.get_buffer() - buffer[2][2] = 1 - buffer[2][3] = 1 - buffer[2][4] = 1 - buffer[2][5] = 1 - buffer[2][6] = 1 - buffer[2][7] = 1 - buffer[2][8] = 1 - buffer[2][9] = 1 - buffer[2][10] = 1 - buffer[2][11] = 1 - buffer[7][2] = 1 - buffer[7][3] = 1 - buffer[7][4] = 1 - buffer[7][5] = 1 - buffer[7][6] = 1 - buffer[7][7] = 1 - buffer[7][8] = 1 - buffer[7][9] = 1 - buffer[7][10] = 1 - buffer[7][11] = 1 + buffer[2][2] = self.color_white + buffer[2][3] = self.color_white + buffer[2][4] = self.color_white + buffer[2][5] = self.color_white + buffer[2][6] = self.color_white + buffer[2][7] = self.color_white + buffer[2][8] = self.color_white + buffer[2][9] = self.color_white + buffer[2][10] = self.color_white + buffer[2][11] = self.color_white + buffer[7][2] = self.color_white + buffer[7][3] = self.color_white + buffer[7][4] = self.color_white + buffer[7][5] = self.color_white + buffer[7][6] = self.color_white + buffer[7][7] = self.color_white + buffer[7][8] = self.color_white + buffer[7][9] = self.color_white + buffer[7][10] = self.color_white + buffer[7][11] = self.color_white - buffer[3][2] = 1 - buffer[4][2] = 1 - buffer[5][2] = 1 - buffer[6][2] = 1 - buffer[3][11] = 1 - buffer[4][11] = 1 - buffer[5][11] = 1 - buffer[6][11] = 1 + buffer[3][2] = self.color_white + buffer[4][2] = self.color_white + buffer[5][2] = self.color_white + buffer[6][2] = self.color_white + buffer[3][11] = self.color_white + buffer[4][11] = self.color_white + buffer[5][11] = self.color_white + buffer[6][11] = self.color_white assert_equal(self.drv.buffer, buffer) def test_fill_rect(self): @@ -214,54 +217,54 @@ class TestPageDrawing(object): buffer = self.get_buffer() for x in range(6): for y in range(10): - buffer[2+x][2+y] = 2 + buffer[2+x][2+y] = self.color_black assert_equal(self.drv.buffer, buffer) def test_draw_circle(self): self.lcd.draw_circle(5, 8, 3) buffer = self.get_buffer() - buffer[2][7] = 1 - buffer[2][8] = 1 - buffer[2][9] = 1 - buffer[3][6] = 1 - buffer[3][7] = 1 - buffer[3][9] = 1 - buffer[3][10] = 1 - buffer[4][5] = 1 - buffer[4][6] = 1 - buffer[4][10] = 1 - buffer[4][11] = 1 - buffer[5][5] = 1 - buffer[5][11] = 1 - buffer[6][5] = 1 - buffer[6][6] = 1 - buffer[7][6] = 1 - buffer[7][7] = 1 - buffer[8][7] = 1 - buffer[8][8] = 1 - buffer[8][9] = 1 - buffer[7][9] = 1 - buffer[7][10] = 1 - buffer[6][10] = 1 - buffer[6][11] = 1 + buffer[2][7] = self.color_white + buffer[2][8] = self.color_white + buffer[2][9] = self.color_white + buffer[3][6] = self.color_white + buffer[3][7] = self.color_white + buffer[3][9] = self.color_white + buffer[3][10] = self.color_white + buffer[4][5] = self.color_white + buffer[4][6] = self.color_white + buffer[4][10] = self.color_white + buffer[4][11] = self.color_white + buffer[5][5] = self.color_white + buffer[5][11] = self.color_white + buffer[6][5] = self.color_white + buffer[6][6] = self.color_white + buffer[7][6] = self.color_white + buffer[7][7] = self.color_white + buffer[8][7] = self.color_white + buffer[8][8] = self.color_white + buffer[8][9] = self.color_white + buffer[7][9] = self.color_white + buffer[7][10] = self.color_white + buffer[6][10] = self.color_white + buffer[6][11] = self.color_white assert_equal(self.drv.buffer, buffer) def test_draw_arc(self): self.lcd.draw_arc(5, 8, 3, 90, 270) buffer = self.get_buffer() - buffer[2][7] = 1 - buffer[2][8] = 1 - buffer[2][9] = 1 - buffer[3][6] = 1 - buffer[3][7] = 1 - buffer[3][9] = 1 - buffer[3][10] = 1 - buffer[4][5] = 1 - buffer[4][6] = 1 - buffer[4][10] = 1 - buffer[4][11] = 1 - buffer[5][5] = 1 - buffer[5][11] = 1 + buffer[2][7] = self.color_white + buffer[2][8] = self.color_white + buffer[2][9] = self.color_white + buffer[3][6] = self.color_white + buffer[3][7] = self.color_white + buffer[3][9] = self.color_white + buffer[3][10] = self.color_white + buffer[4][5] = self.color_white + buffer[4][6] = self.color_white + buffer[4][10] = self.color_white + buffer[4][11] = self.color_white + buffer[5][5] = self.color_white + buffer[5][11] = self.color_white assert_equal(self.drv.buffer, buffer) def draw_buffer(self, buffer): diff --git a/gfxlcd/tests/test_ili9325.py b/gfxlcd/tests/test_ili9325.py new file mode 100644 index 0000000..2d35d90 --- /dev/null +++ b/gfxlcd/tests/test_ili9325.py @@ -0,0 +1,13 @@ +import sys +from nose.tools import assert_equal +sys.path.append("../../") +from gfxlcd.driver.ili9325.gpio import GPIO +from gfxlcd.driver.ili9325.ili9325 import ILI9325 + + +class TestILI9325Drawing(object): + def test_initialize(self): + drv = GPIO() + drv.pins['LED'] = 6 + drv.pins['CS'] = 18 + ILI9325(240, 320, drv) diff --git a/gfxlcd/tests/test_ili9486.py b/gfxlcd/tests/test_ili9486.py new file mode 100644 index 0000000..1232a57 --- /dev/null +++ b/gfxlcd/tests/test_ili9486.py @@ -0,0 +1,10 @@ +import sys +from nose.tools import assert_equal +sys.path.append("../../") +from gfxlcd.driver.ili9486.spi import SPI +from gfxlcd.driver.ili9486.ili9486 import ILI9486 + + +class TestILI9486(object): + def test_initialize(self): + ILI9486(320, 480, SPI()) diff --git a/gfxlcd/tests/test_nju6450.py b/gfxlcd/tests/test_nju6450.py new file mode 100644 index 0000000..7f339f5 --- /dev/null +++ b/gfxlcd/tests/test_nju6450.py @@ -0,0 +1,11 @@ +import sys +from nose.tools import assert_equal +sys.path.append("../../") +from gfxlcd.driver.nju6450.gpio import GPIO +from gfxlcd.driver.nju6450.nju6450 import NJU6450 + + +class TestNJU6450(object): + def test_initialize(self): + drv = GPIO() + NJU6450(122, 32, drv) diff --git a/gfxlcd/tests/test_ssd1306.py b/gfxlcd/tests/test_ssd1306.py new file mode 100644 index 0000000..509950c --- /dev/null +++ b/gfxlcd/tests/test_ssd1306.py @@ -0,0 +1,10 @@ +import sys +from nose.tools import assert_equal +sys.path.append("../../") +from gfxlcd.driver.ssd1306.spi import SPI +from gfxlcd.driver.ssd1306.ssd1306 import SSD1306 + + +class TestNJU6450(object): + def test_initialize(self): + SSD1306(128, 64, SPI()) From d9ee0f388d8a621b4fcd894aedb110e5a5eae3e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartosz=20Ko=C5=9Bci=C3=B3w?= Date: Sat, 8 Jul 2017 20:07:42 +0200 Subject: [PATCH 2/4] improved drawing text for area drawing --- gfxlcd/abstract/chip.py | 10 ---------- gfxlcd/drawing/area.py | 24 ++++++++++++++++++++++++ gfxlcd/drawing/pixel.py | 8 ++++++-- gfxlcd/driver/hd44780.py | 2 +- gfxlcd/driver/ili9325/ili9325.py | 16 ---------------- gfxlcd/driver/ili9486/ili9486.py | 16 ---------------- gfxlcd/driver/nju6450/nju6450.py | 8 -------- gfxlcd/driver/ssd1306/ssd1306.py | 8 -------- 8 files changed, 31 insertions(+), 61 deletions(-) diff --git a/gfxlcd/abstract/chip.py b/gfxlcd/abstract/chip.py index fd8c55a..6e1eb64 100644 --- a/gfxlcd/abstract/chip.py +++ b/gfxlcd/abstract/chip.py @@ -30,16 +30,6 @@ class Chip(metaclass=abc.ABCMeta): else: return self._width - # @abc.abstractmethod - # def _converted_background_color(self): - # """convert RGB background to available color""" - # pass - # - # @abc.abstractmethod - # def _converted_color(self): - # """convert RGB color to available color""" - # pass - @abc.abstractmethod def _convert_color(self, color): """convert color to avaible one""" diff --git a/gfxlcd/drawing/area.py b/gfxlcd/drawing/area.py index de4fae8..092c4f6 100644 --- a/gfxlcd/drawing/area.py +++ b/gfxlcd/drawing/area.py @@ -160,3 +160,27 @@ class Area(Pixel): return True return False + + def _draw_letter(self, pos_x, pos_y, letter, with_background=False): + """draw a letter""" + if not with_background: + super()._draw_letter(pos_x, pos_y, letter, with_background) + else: + font = self.options['font'] + self._set_area( + pos_x, + pos_y, + pos_x + font.size[0] - 1, + pos_y + font.size[1] - 1 + ) + + bits = font.size[0] + color = self._convert_color(self.options['color']) + background_color = self._convert_color(self.options['background_color']) + for row, data in enumerate(font.get(letter)): + for bit in range(bits): + if data & 0x01: + self.driver.data(color, None) + elif with_background: + self.driver.data(background_color, None) + data >>= 1 diff --git a/gfxlcd/drawing/pixel.py b/gfxlcd/drawing/pixel.py index 209ad3f..4dca13d 100644 --- a/gfxlcd/drawing/pixel.py +++ b/gfxlcd/drawing/pixel.py @@ -152,8 +152,12 @@ class Pixel(object): for row, data in enumerate(font.get(letter)): for bit in range(bits): if data & 0x01: - self.draw_pixel(pos_x + bit, pos_y + row) + self.draw_pixel( + pos_x + bit, pos_y + row, self.color + ) elif with_background: - self.draw_pixel(pos_x + bit, pos_y + row) + self.draw_pixel( + pos_x + bit, pos_y + row, self.background_color + ) data >>= 1 diff --git a/gfxlcd/driver/hd44780.py b/gfxlcd/driver/hd44780.py index 7423805..3386c1e 100644 --- a/gfxlcd/driver/hd44780.py +++ b/gfxlcd/driver/hd44780.py @@ -60,7 +60,7 @@ class HD44780(BaseDriver): def char(self, char, enable=0): """write char to lcd""" self.gfxlcd.draw_text( - self.position['x'], self.position['y'], char + self.position['x'], self.position['y'], char, True ) self._increase_x() diff --git a/gfxlcd/driver/ili9325/ili9325.py b/gfxlcd/driver/ili9325/ili9325.py index 1bdd5fb..2cc68a0 100644 --- a/gfxlcd/driver/ili9325/ili9325.py +++ b/gfxlcd/driver/ili9325/ili9325.py @@ -33,22 +33,6 @@ class ILI9325(Area, Chip): Chip.__init__(self, width, height, driver, True) Area.__init__(self, driver) - # def _converted_background_color(self): - # """color from 8-8-8 to 5-6-5""" - # rgb = self.options['background_color']['R'] << 16 | \ - # self.options['background_color']['G'] << 8 | \ - # self.options['background_color']['B'] - # return ((rgb & 0x00f80000) >> 8) |\ - # ((rgb & 0x0000fc00) >> 5) | ((rgb & 0x000000f8) >> 3) - # - # def _converted_color(self): - # """color from 8-8-8 to 5-6-5""" - # rgb = self.options['color']['R'] << 16 | \ - # self.options['color']['G'] << 8 | \ - # self.options['color']['B'] - # return ((rgb & 0x00f80000) >> 8) |\ - # ((rgb & 0x0000fc00) >> 5) | ((rgb & 0x000000f8) >> 3) - def _convert_color(self, color): """color from 8-8-8 to 5-6-5""" rgb = color['R'] << 16 | \ diff --git a/gfxlcd/driver/ili9486/ili9486.py b/gfxlcd/driver/ili9486/ili9486.py index b32843b..2d5d693 100644 --- a/gfxlcd/driver/ili9486/ili9486.py +++ b/gfxlcd/driver/ili9486/ili9486.py @@ -12,22 +12,6 @@ class ILI9486(Area, Chip): Chip.__init__(self, width, height, driver, True) Area.__init__(self, driver) - # def _converted_background_color(self): - # """color from 8-8-8 to 5-6-5""" - # rgb = self.options['background_color']['R'] << 16 | \ - # self.options['background_color']['G'] << 8 | \ - # self.options['background_color']['B'] - # return ((rgb & 0x00f80000) >> 8) |\ - # ((rgb & 0x0000fc00) >> 5) | ((rgb & 0x000000f8) >> 3) - # - # def _converted_color(self): - # """color from 8-8-8 to 5-6-5""" - # rgb = self.options['color']['R'] << 16 | \ - # self.options['color']['G'] << 8 | \ - # self.options['color']['B'] - # return ((rgb & 0x00f80000) >> 8) |\ - # ((rgb & 0x0000fc00) >> 5) | ((rgb & 0x000000f8) >> 3) - def _convert_color(self, color): """color from 8-8-8 to 5-6-5""" rgb = color['R'] << 16 | \ diff --git a/gfxlcd/driver/nju6450/nju6450.py b/gfxlcd/driver/nju6450/nju6450.py index e4be7e1..682f8ae 100644 --- a/gfxlcd/driver/nju6450/nju6450.py +++ b/gfxlcd/driver/nju6450/nju6450.py @@ -36,14 +36,6 @@ class NJU6450(Page, Chip): self.driver.cmd(0xB8 | pos_y, 1) self.driver.cmd(0x00 | (pos_x - width//2), 1) - # def _converted_background_color(self): - # """convert RGB background to available color""" - # return 1 - # - # def _converted_color(self): - # """convert RGB color to available color""" - # return 1 - def _convert_color(self, color): """convert color to avaiable one""" if color['R'] == 0 and color['G'] == 0 and color['B'] == 0: diff --git a/gfxlcd/driver/ssd1306/ssd1306.py b/gfxlcd/driver/ssd1306/ssd1306.py index a5b40dd..2f3b8c4 100644 --- a/gfxlcd/driver/ssd1306/ssd1306.py +++ b/gfxlcd/driver/ssd1306/ssd1306.py @@ -76,14 +76,6 @@ class SSD1306(Page, Chip): self.driver.cmd(0x14) # enable charge pump self.driver.cmd(0xaf) # turn on panel - # def _converted_background_color(self): - # """convert RGB background to available color""" - # return 1 - # - # def _converted_color(self): - # """convert RGB color to available color""" - # return 1 - def _convert_color(self, color): """convert color to avaiable one""" if color['R'] == 0 and color['G'] == 0 and color['B'] == 0: From f2c059dcc78c73be8edbb8f3d24e52232aba0de4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartosz=20Ko=C5=9Bci=C3=B3w?= Date: Sat, 8 Jul 2017 20:08:26 +0200 Subject: [PATCH 3/4] improved drawing text for area drawing --- gfxlcd/drawing/area.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gfxlcd/drawing/area.py b/gfxlcd/drawing/area.py index 092c4f6..a8ff163 100644 --- a/gfxlcd/drawing/area.py +++ b/gfxlcd/drawing/area.py @@ -181,6 +181,6 @@ class Area(Pixel): for bit in range(bits): if data & 0x01: self.driver.data(color, None) - elif with_background: + else: self.driver.data(background_color, None) data >>= 1 From d7a2904a7fcd7541dc3f66706b60fbc1cc8e231f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartosz=20Ko=C5=9Bci=C3=B3w?= Date: Sat, 8 Jul 2017 22:16:15 +0200 Subject: [PATCH 4/4] HD44780 for NJU and SSD --- gfxlcd/abstract/chip.py | 2 +- gfxlcd/demos/nju_hd44780.py | 28 ++++++++++++++++++++++++++++ gfxlcd/demos/ssd_hd44780.py | 28 ++++++++++++++++++++++++++++ gfxlcd/driver/hd44780.py | 15 ++++++++++++--- gfxlcd/driver/nju6450/nju6450.py | 6 +++--- gfxlcd/driver/ssd1306/ssd1306.py | 6 +++--- 6 files changed, 75 insertions(+), 10 deletions(-) create mode 100644 gfxlcd/demos/nju_hd44780.py create mode 100644 gfxlcd/demos/ssd_hd44780.py diff --git a/gfxlcd/abstract/chip.py b/gfxlcd/abstract/chip.py index 6e1eb64..8bbca39 100644 --- a/gfxlcd/abstract/chip.py +++ b/gfxlcd/abstract/chip.py @@ -85,7 +85,7 @@ class Chip(metaclass=abc.ABCMeta): pass @abc.abstractmethod - def draw_pixel(self, pos_x, pos_y): + def draw_pixel(self, pos_x, pos_y, color=None): """draw a pixel at x,y""" pass diff --git a/gfxlcd/demos/nju_hd44780.py b/gfxlcd/demos/nju_hd44780.py new file mode 100644 index 0000000..afb0b36 --- /dev/null +++ b/gfxlcd/demos/nju_hd44780.py @@ -0,0 +1,28 @@ +import sys +sys.path.append("../../") +import RPi.GPIO # NOQA pylint: disable=I0011,F0401 +from charlcd.buffered import CharLCD # NOQA +from gfxlcd.driver.nju6450.gpio import GPIO +from gfxlcd.driver.nju6450.nju6450 import NJU6450 +from gfxlcd.driver.hd44780 import HD44780 +RPi.GPIO.setmode(RPi.GPIO.BCM) + + +def test1(): + """demo """ + lcd = NJU6450(122, 32, GPIO()) + + drv = HD44780(lcd, True) + print(drv.width, drv.height) + lcd = CharLCD(drv.width, drv.height, drv, 0, 0) + lcd.init() + lcd.write('First') + + lcd.write('HD44780', 6, 3) + lcd.flush() + lcd.write('/* ', 12, 0) + lcd.write('|*|', 12, 1) + lcd.write(' */', 12, 2) + lcd.flush() + +test1() diff --git a/gfxlcd/demos/ssd_hd44780.py b/gfxlcd/demos/ssd_hd44780.py new file mode 100644 index 0000000..d64d365 --- /dev/null +++ b/gfxlcd/demos/ssd_hd44780.py @@ -0,0 +1,28 @@ +import sys +sys.path.append("../../") +import RPi.GPIO # NOQA pylint: disable=I0011,F0401 +from charlcd.buffered import CharLCD # NOQA +from gfxlcd.driver.ssd1306.spi import SPI +from gfxlcd.driver.ssd1306.ssd1306 import SSD1306 +from gfxlcd.driver.hd44780 import HD44780 +RPi.GPIO.setmode(RPi.GPIO.BCM) + + +def test1(): + """demo """ + lcd = SSD1306(128, 64, SPI()) + + drv = HD44780(lcd, True) + print(drv.width, drv.height) + lcd = CharLCD(drv.width, drv.height, drv, 0, 0) + lcd.init() + lcd.write('First') + + lcd.write('HD44780', 6, 3) + lcd.flush() + lcd.write('/* ', 12, 0) + lcd.write('|*|', 12, 1) + lcd.write(' */', 12, 2) + lcd.flush() + +test1() diff --git a/gfxlcd/driver/hd44780.py b/gfxlcd/driver/hd44780.py index 3386c1e..8f74075 100644 --- a/gfxlcd/driver/hd44780.py +++ b/gfxlcd/driver/hd44780.py @@ -2,15 +2,16 @@ allows graphical LCD to work as character LCD """ from charlcd.drivers.base import BaseDriver -from charlcd.abstract import lcd as char_lcd +from charlcd.abstract.flush_event_interface import FlushEvent -class HD44780(BaseDriver): - def __init__(self, gfxlcd): +class HD44780(BaseDriver, FlushEvent): + def __init__(self, gfxlcd, lcd_flush=False): """Class init""" self.gfxlcd = gfxlcd self.mode = 0 self.initialized = False + self.lcd_flush = lcd_flush self.font = self.gfxlcd.options['font'] self.width = self.gfxlcd.width // self.font.size[0] self.height = self.gfxlcd.height // self.font.size[1] @@ -73,3 +74,11 @@ class HD44780(BaseDriver): def get_line_address(self, idx): return self.address[idx] + + def pre_flush(self, buffer): + pass + + def post_flush(self, buffer): + """called after flush()""" + if self.lcd_flush: + self.gfxlcd.flush(True) diff --git a/gfxlcd/driver/nju6450/nju6450.py b/gfxlcd/driver/nju6450/nju6450.py index 682f8ae..673e123 100644 --- a/gfxlcd/driver/nju6450/nju6450.py +++ b/gfxlcd/driver/nju6450/nju6450.py @@ -6,7 +6,7 @@ from gfxlcd.abstract.chip import Chip class NJU6450(Page, Chip): """Class for an LCD with NJU6450 chip""" - def __init__(self, width, height, driver, auto_flush=True): + def __init__(self, width, height, driver, auto_flush=False): Chip.__init__(self, width, height, driver, auto_flush) Page.__init__(self, driver) self.rotation = 0 @@ -62,7 +62,7 @@ class NJU6450(Page, Chip): else: self.driver.data(self.get_page_value(i, j), 1) - def draw_pixel(self, pos_x, pos_y): + def draw_pixel(self, pos_x, pos_y, color=None): """draw a pixel at x,y""" if self.rotation == 90: pos_x, pos_y = self.height - pos_y - 1, pos_x @@ -70,7 +70,7 @@ class NJU6450(Page, Chip): pos_x, pos_y = self.width - pos_x - 1, self.height - pos_y - 1 if self.rotation == 270: pos_x, pos_y = pos_y, self.width - pos_x - 1 - Page.draw_pixel(self, pos_x, pos_y) + Page.draw_pixel(self, pos_x, pos_y, color) def fill_rect(self, pos_x1, pos_y1, pos_x2, pos_y2): """draw a filled rectangle""" diff --git a/gfxlcd/driver/ssd1306/ssd1306.py b/gfxlcd/driver/ssd1306/ssd1306.py index 2f3b8c4..fd5ffa8 100644 --- a/gfxlcd/driver/ssd1306/ssd1306.py +++ b/gfxlcd/driver/ssd1306/ssd1306.py @@ -24,7 +24,7 @@ class SSD1306(Page, Chip): } } - def __init__(self, width, height, driver, auto_flush=True): + def __init__(self, width, height, driver, auto_flush=False): Chip.__init__(self, width, height, driver, auto_flush) Page.__init__(self, driver) self.rotation = 0 @@ -107,8 +107,8 @@ class SSD1306(Page, Chip): self.driver.cmd(pos_x1) self.driver.cmd(pos_x2) - def draw_pixel(self, pos_x, pos_y): + def draw_pixel(self, pos_x, pos_y, color=None): """draw a pixel at x,y""" if self.rotation == 90 or self.rotation == 270: pos_x, pos_y = pos_y, pos_x - Page.draw_pixel(self, pos_x, pos_y) + Page.draw_pixel(self, pos_x, pos_y, color)