kopia lustrzana https://github.com/peterhinch/micropython-nano-gui
Use framebuf.ellipse, migrate create_color to CWriter.
rodzic
b9b93e2443
commit
838cf40522
|
@ -4,40 +4,37 @@
|
||||||
# Copyright (c) 2020 Peter Hinch
|
# Copyright (c) 2020 Peter Hinch
|
||||||
|
|
||||||
# As written, supports:
|
# As written, supports:
|
||||||
# Adafruit 1.5" 128*128 OLED display: https://www.adafruit.com/product/1431
|
# ili9341 240x320 displays on Pi Pico
|
||||||
# Adafruit 1.27" 128*96 display https://www.adafruit.com/product/1673
|
|
||||||
# Edit the driver import for other displays.
|
# Edit the driver import for other displays.
|
||||||
|
|
||||||
# Demo of initialisation procedure designed to minimise risk of memory fail
|
# 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
|
# when instantiating the frame buffer. The aim is to do this as early as
|
||||||
# possible before importing other modules.
|
# possible before importing other modules.
|
||||||
|
|
||||||
# WIRING (Adafruit pin nos and names).
|
# WIRING
|
||||||
# Pyb SSD
|
# Pico Display
|
||||||
# 3v3 Vin (10)
|
# GPIO Pin
|
||||||
# Gnd Gnd (11)
|
# 3v3 36 Vin
|
||||||
# Y1 DC (3 DC)
|
# IO6 9 CLK Hardware SPI0
|
||||||
# Y2 CS (5 OC OLEDCS)
|
# IO7 10 DATA (AKA SI MOSI)
|
||||||
# Y3 Rst (4 R RESET)
|
# IO8 11 DC
|
||||||
# Y6 CLK (2 CL SCK)
|
# IO9 12 Rst
|
||||||
# Y8 DATA (1 SI MOSI)
|
# Gnd 13 Gnd
|
||||||
|
# IO10 14 CS
|
||||||
|
|
||||||
import machine
|
from machine import Pin, SPI
|
||||||
import gc
|
import gc
|
||||||
|
|
||||||
# *** Choose your color display driver here ***
|
# *** Choose your color display driver here ***
|
||||||
# Driver supporting non-STM platforms
|
# ili9341 specific driver
|
||||||
# from drivers.ssd1351.ssd1351_generic import SSD1351 as SSD
|
from drivers.ili93xx.ili9341 import ILI9341 as SSD
|
||||||
|
|
||||||
# STM specific driver
|
pdc = Pin(8, Pin.OUT, value=0) # Arbitrary pins
|
||||||
from drivers.ssd1351.ssd1351 import SSD1351 as SSD
|
prst = Pin(9, Pin.OUT, value=1)
|
||||||
|
pcs = Pin(10, Pin.OUT, value=1)
|
||||||
|
|
||||||
height = 96 # 1.27 inch 96*128 (rows*cols) display
|
# Kept as ssd to maintain compatability
|
||||||
# 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)
|
|
||||||
gc.collect() # Precaution before instantiating framebuf
|
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)
|
||||||
|
|
|
@ -4,18 +4,11 @@
|
||||||
# Copyright (c) 2020 Peter Hinch
|
# Copyright (c) 2020 Peter Hinch
|
||||||
|
|
||||||
from color_setup import SSD
|
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
|
# Code can be portable between 4-bit and other drivers by calling create_color
|
||||||
def create_color(idx, r, g, b):
|
def create_color(idx, r, g, b):
|
||||||
c = SSD.rgb(r, g, b)
|
return CWriter.create_color(SSD, idx, 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
|
|
||||||
|
|
||||||
if hasattr(SSD, 'lut'): # Colors defined by LUT
|
if hasattr(SSD, 'lut'): # Colors defined by LUT
|
||||||
BLACK = create_color(0, 0, 0, 0)
|
BLACK = create_color(0, 0, 0, 0)
|
||||||
|
|
|
@ -14,48 +14,16 @@ from gui.core.writer import Writer
|
||||||
import framebuf
|
import framebuf
|
||||||
import gc
|
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
|
def circle(dev, x0, y0, r, color, _=1): # Draw circle
|
||||||
x0, y0, r = int(x0), int(y0), int(r)
|
x, y, r = int(x0), int(y0), int(r)
|
||||||
for r in range(r, r -width, -1):
|
dev.ellipse(x, y, r, r, color)
|
||||||
_circle(dev, x0, y0, r, color)
|
|
||||||
|
|
||||||
def fillcircle(dev, x0, y0, r, color): # Draw filled circle
|
def fillcircle(dev, x0, y0, r, color): # Draw filled circle
|
||||||
x0, y0, r = int(x0), int(y0), int(r)
|
x, y, r = int(x0), int(y0), int(r)
|
||||||
x = -r
|
dev.ellipse(x, y, r, r, color, True)
|
||||||
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
|
|
||||||
|
|
||||||
# If a (framebuf based) device is passed to refresh, the screen is cleared.
|
# 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.
|
# 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
|
# The pend mechanism enables a displayable object to postpone its renedering
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# writer.py Implements the Writer class.
|
# writer.py Implements the Writer class.
|
||||||
# Handles colour, word wrap and tab stops
|
# 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.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.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
|
# 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
|
from sys import implementation
|
||||||
import os
|
import os
|
||||||
|
|
||||||
__version__ = (0, 5, 0)
|
__version__ = (0, 5, 1)
|
||||||
|
|
||||||
fast_mode = True # Does nothing. Kept to avoid breaking code.
|
fast_mode = True # Does nothing. Kept to avoid breaking code.
|
||||||
|
|
||||||
|
@ -255,6 +256,17 @@ class Writer():
|
||||||
# Writer for colour displays.
|
# Writer for colour displays.
|
||||||
class CWriter(Writer):
|
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):
|
def __init__(self, device, font, fgcolor=None, bgcolor=None, verbose=True):
|
||||||
if not hasattr(device, 'palette'):
|
if not hasattr(device, 'palette'):
|
||||||
|
|
Ładowanie…
Reference in New Issue