Use framebuf.ellipse, migrate create_color to CWriter.

pull/56/head
peterhinch 2022-12-06 17:51:54 +00:00
rodzic b9b93e2443
commit 838cf40522
4 zmienionych plików z 43 dodań i 73 usunięć

Wyświetl plik

@ -4,40 +4,37 @@
# Copyright (c) 2020 Peter Hinch
# As written, supports:
# Adafruit 1.5" 128*128 OLED display: https://www.adafruit.com/product/1431
# Adafruit 1.27" 128*96 display https://www.adafruit.com/product/1673
# ili9341 240x320 displays on Pi Pico
# Edit the driver import for other displays.
# Demo of initialisation procedure designed to minimise risk of memory fail
# when instantiating the frame buffer. The aim is to do this as early as
# possible before importing other modules.
# WIRING (Adafruit pin nos and names).
# Pyb SSD
# 3v3 Vin (10)
# Gnd Gnd (11)
# Y1 DC (3 DC)
# Y2 CS (5 OC OLEDCS)
# Y3 Rst (4 R RESET)
# Y6 CLK (2 CL SCK)
# Y8 DATA (1 SI MOSI)
# WIRING
# Pico Display
# GPIO Pin
# 3v3 36 Vin
# IO6 9 CLK Hardware SPI0
# IO7 10 DATA (AKA SI MOSI)
# IO8 11 DC
# IO9 12 Rst
# Gnd 13 Gnd
# IO10 14 CS
import machine
from machine import Pin, SPI
import gc
# *** Choose your color display driver here ***
# Driver supporting non-STM platforms
# from drivers.ssd1351.ssd1351_generic import SSD1351 as SSD
# ili9341 specific driver
from drivers.ili93xx.ili9341 import ILI9341 as SSD
# STM specific driver
from drivers.ssd1351.ssd1351 import SSD1351 as SSD
pdc = Pin(8, Pin.OUT, value=0) # Arbitrary pins
prst = Pin(9, Pin.OUT, value=1)
pcs = Pin(10, Pin.OUT, value=1)
height = 96 # 1.27 inch 96*128 (rows*cols) display
# height = 128 # 1.5 inch 128*128 display
pdc = machine.Pin('Y1', machine.Pin.OUT_PP, value=0)
pcs = machine.Pin('Y2', machine.Pin.OUT_PP, value=1)
prst = machine.Pin('Y3', machine.Pin.OUT_PP, value=1)
spi = machine.SPI(2)
# Kept as ssd to maintain compatability
gc.collect() # Precaution before instantiating framebuf
ssd = SSD(spi, pcs, pdc, prst, height) # Create a display instance
# See DRIVERS.md re overclocking the SPI bus
spi = SPI(0, sck=Pin(6), mosi=Pin(7), miso=Pin(4), baudrate=30_000_000)
ssd = SSD(spi, dc=pdc, cs=pcs, rst=prst)

Wyświetl plik

@ -4,18 +4,11 @@
# Copyright (c) 2020 Peter Hinch
from color_setup import SSD
from gui.core.writer import CWriter
# Code can be portable between 4-bit and other drivers by calling create_color
def create_color(idx, r, g, b):
c = SSD.rgb(r, g, b)
if not hasattr(SSD, 'lut'):
return c
if not 0 <= idx <= 15:
raise ValueError('Color nos must be 0..15')
x = idx << 1
SSD.lut[x] = c & 0xff
SSD.lut[x + 1] = c >> 8
return idx
return CWriter.create_color(SSD, idx, r, g, b)
if hasattr(SSD, 'lut'): # Colors defined by LUT
BLACK = create_color(0, 0, 0, 0)

Wyświetl plik

@ -14,48 +14,16 @@ from gui.core.writer import Writer
import framebuf
import gc
def _circle(dev, x0, y0, r, color): # Single pixel circle
x = -r
y = 0
err = 2 -2*r
while x <= 0:
dev.pixel(x0 -x, y0 +y, color)
dev.pixel(x0 +x, y0 +y, color)
dev.pixel(x0 +x, y0 -y, color)
dev.pixel(x0 -x, y0 -y, color)
e2 = err
if (e2 <= y):
y += 1
err += y*2 +1
if (-x == y and e2 <= x):
e2 = 0
if (e2 > x):
x += 1
err += x*2 +1
def circle(dev, x0, y0, r, color, width =1): # Draw circle
x0, y0, r = int(x0), int(y0), int(r)
for r in range(r, r -width, -1):
_circle(dev, x0, y0, r, color)
def circle(dev, x0, y0, r, color, _=1): # Draw circle
x, y, r = int(x0), int(y0), int(r)
dev.ellipse(x, y, r, r, color)
def fillcircle(dev, x0, y0, r, color): # Draw filled circle
x0, y0, r = int(x0), int(y0), int(r)
x = -r
y = 0
err = 2 -2*r
while x <= 0:
dev.line(x0 -x, y0 -y, x0 -x, y0 +y, color)
dev.line(x0 +x, y0 -y, x0 +x, y0 +y, color)
e2 = err
if (e2 <= y):
y +=1
err += y*2 +1
if (-x == y and e2 <= x):
e2 = 0
if (e2 > x):
x += 1
err += x*2 +1
x, y, r = int(x0), int(y0), int(r)
dev.ellipse(x, y, r, r, color, True)
# If a (framebuf based) device is passed to refresh, the screen is cleared.
# None causes pending widgets to be drawn and the result to be copied to hardware.
# The pend mechanism enables a displayable object to postpone its renedering

Wyświetl plik

@ -1,6 +1,7 @@
# writer.py Implements the Writer class.
# Handles colour, word wrap and tab stops
# V0.5.1 Dec 2022 Support 4-bit color display drivers.
# V0.5.0 Sep 2021 Color now requires firmware >= 1.17.
# V0.4.3 Aug 2021 Support for fast blit to color displays (PR7682).
# V0.4.0 Jan 2021 Improved handling of word wrap and line clip. Upside-down
@ -25,7 +26,7 @@ from uctypes import bytearray_at, addressof
from sys import implementation
import os
__version__ = (0, 5, 0)
__version__ = (0, 5, 1)
fast_mode = True # Does nothing. Kept to avoid breaking code.
@ -255,6 +256,17 @@ class Writer():
# Writer for colour displays.
class CWriter(Writer):
@staticmethod
def create_color(ssd, idx, r, g, b):
c = ssd.rgb(r, g, b)
if not hasattr(ssd, 'lut'):
return c
if not 0 <= idx <= 15:
raise ValueError('Color nos must be 0..15')
x = idx << 1
ssd.lut[x] = c & 0xff
ssd.lut[x + 1] = c >> 8
return idx
def __init__(self, device, font, fgcolor=None, bgcolor=None, verbose=True):
if not hasattr(device, 'palette'):