Some fixes to the host software geom stuff, added a small demo script
This commit is contained in:
parent
f2731bac95
commit
a95e0305ae
9 changed files with 58 additions and 23 deletions
|
|
@ -272,11 +272,10 @@ int main(void) {
|
|||
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI2);
|
||||
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI3);
|
||||
|
||||
/* 200kBd */
|
||||
MAP_SSIConfigSetExpClk(SSI0_BASE, MAP_SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 1000000, 8);
|
||||
MAP_SSIConfigSetExpClk(SSI1_BASE, MAP_SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 1000000, 8);
|
||||
MAP_SSIConfigSetExpClk(SSI2_BASE, MAP_SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 1000000, 8);
|
||||
MAP_SSIConfigSetExpClk(SSI3_BASE, MAP_SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 1000000, 8);
|
||||
MAP_SSIConfigSetExpClk(SSI0_BASE, MAP_SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 2000000, 8);
|
||||
MAP_SSIConfigSetExpClk(SSI1_BASE, MAP_SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 2000000, 8);
|
||||
MAP_SSIConfigSetExpClk(SSI2_BASE, MAP_SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 2000000, 8);
|
||||
MAP_SSIConfigSetExpClk(SSI3_BASE, MAP_SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 2000000, 8);
|
||||
|
||||
/* Configure the µDMA controller for use by the SPI interface */
|
||||
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
|
||||
|
|
|
|||
|
|
@ -9,23 +9,27 @@ DEFAULT_SCROLL_SPEED = 4
|
|||
# Pixels to leave blank between two letters
|
||||
LETTER_SPACING = 1
|
||||
|
||||
FONT = bdflib.reader.read_bdf(open('fonts/5x8.bdf').readlines())
|
||||
FONT_WIDTH = 5
|
||||
#FONT = bdflib.reader.read_bdf(open('fonts/5x8.bdf').readlines())
|
||||
#FONT_WIDTH = 5
|
||||
|
||||
# Computed value
|
||||
FONT_PADDED_BINARY = ('{:0'+str(FONT_WIDTH+'b}').format
|
||||
#FONT_PADDED_BINARY = ('{:0'+str(FONT_WIDTH+'b}').format
|
||||
|
||||
# Display geometry
|
||||
# ┌─────────┐ ┌───┬───┬ ⋯ ┬───┬───┐
|
||||
# │1 o o o 5│ │ 1 │ │ │ │16 │
|
||||
# │1 o o o 5│ │ 1 │ │ │ │ 8│
|
||||
# │6 o o o o│ ├───┼───┼ ⋯ ┼───┼───┤
|
||||
# │o o o o o│ │17 │ │ │ │32 │
|
||||
# │o o o o20│ └───┴───┴ ⋯ ┴───┴───┘
|
||||
# └─────────┘
|
||||
# │o o o o o│ │ 9 │ │ │ │16 │
|
||||
# │o o o o20│ ├───┼───┼ ⋯ ┼───┼───┤
|
||||
# └─────────┘ │17 │ │ │ │24 │
|
||||
# ├───┼───┼ ⋯ ┼───┼───┤
|
||||
# │25 │ │ │ │32 │
|
||||
# └───┴───┴ ⋯ ┴───┴───┘
|
||||
|
||||
CRATE_WIDTH = 5
|
||||
CRATE_HEIGHT = 4
|
||||
CRATES_X = 16
|
||||
CRATES_Y = 2
|
||||
CRATES_X = 8
|
||||
CRATES_Y = 4
|
||||
|
||||
# Computed values
|
||||
DISPLAY_WIDTH = CRATES_X * CRATE_WIDTH
|
||||
|
|
|
|||
|
|
@ -1,16 +1,19 @@
|
|||
from pyusb import usb
|
||||
import usb
|
||||
import colorsys
|
||||
import numpy as np
|
||||
from config import *
|
||||
import itertools
|
||||
|
||||
dev = usb.core.find(idVendor=0x1cbe, idProduct=0x0003)
|
||||
|
||||
def sendframe(framedata):
|
||||
if not isinstance(framedata, np.array) or framedata.shape != (DISPLAY_WIDTH, DISPLAY_HEIGHT, 3) or framedata.dtype != np.int8:
|
||||
raise ValueError('framedata must be a ({}, {}, 3)-numpy array of int8s'.format(DISPLAY_WIDTH, DISPLAY_HEIGHT))
|
||||
# not isinstance(framedata, np.array) or
|
||||
if framedata.shape != (DISPLAY_HEIGHT, DISPLAY_WIDTH, 3) or framedata.dtype != np.uint8:
|
||||
raise ValueError('framedata must be a ({}, {}, 3)-numpy array of int8s. Got a {}-numpy array of {}'.format(DISPLAY_WIDTH, DISPLAY_HEIGHT, framedata.shape, framedata.dtype))
|
||||
|
||||
for cx, cy in itertools.product(range(16), range(2)):
|
||||
cratedata = framedata[cx*CRATE_WIDTH:(cx+1)*CRATE_WIDTH, cy*CRATE_HEIGHT:(cy+1)*CRATE_HEIGHT]
|
||||
# Send framebuffer data
|
||||
dev.write(0x01, bytes([0, x, y])+bytes(list(cratedata.flatten())))
|
||||
# Send latch command
|
||||
dev.write(0x01, b'\x01')
|
||||
for cy, cx in itertools.product(range(CRATES_Y), range(CRATES_X)):
|
||||
cratedata = framedata[cy*CRATE_HEIGHT:(cy+1)*CRATE_HEIGHT, cx*CRATE_WIDTH:(cx+1)*CRATE_WIDTH]
|
||||
# Send framebuffer data
|
||||
dev.write(0x01, bytes([0, cx, cy])+bytes(list(cratedata.flatten())))
|
||||
# Send latch command
|
||||
dev.write(0x01, b'\x01')
|
||||
|
|
|
|||
29
host/matelight/nyancat-test.py
Executable file
29
host/matelight/nyancat-test.py
Executable file
|
|
@ -0,0 +1,29 @@
|
|||
#!/usr/bin/env python3
|
||||
import host
|
||||
import numpy as np
|
||||
from config import *
|
||||
from PIL import Image, ImageSequence
|
||||
import time
|
||||
|
||||
img1 = Image.open(open('../nyancat.png', 'rb'))
|
||||
img2 = Image.open(open('../nyancat2.png', 'rb'))
|
||||
scroller = Image.open(open('../scroller.png', 'rb'))
|
||||
datas = []
|
||||
for img in [img1, img2]:
|
||||
im = img.convert("RGB")
|
||||
im.thumbnail((DISPLAY_WIDTH, DISPLAY_HEIGHT), Image.NEAREST)
|
||||
data = np.array(im.getdata(), dtype=np.uint8)
|
||||
datas += [data.reshape((DISPLAY_HEIGHT, DISPLAY_WIDTH, 3))]
|
||||
|
||||
im = scroller.convert("RGB")
|
||||
bar = np.array(im.getdata(), dtype=np.uint8)
|
||||
foo = bar.reshape((DISPLAY_HEIGHT, 300, 3))
|
||||
|
||||
while True:
|
||||
for i in range(20):
|
||||
for data in datas:
|
||||
host.sendframe(data)
|
||||
time.sleep(0.1)
|
||||
for i in range(260):
|
||||
host.sendframe(foo[:, i:i+40, :])
|
||||
|
||||
BIN
host/nyancat.png
Normal file
BIN
host/nyancat.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 483 B |
BIN
host/nyancat.xcf
Normal file
BIN
host/nyancat.xcf
Normal file
Binary file not shown.
BIN
host/nyancat2.png
Normal file
BIN
host/nyancat2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 477 B |
BIN
host/nyancat2.xcf
Normal file
BIN
host/nyancat2.xcf
Normal file
Binary file not shown.
BIN
host/scroller.png
Normal file
BIN
host/scroller.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.5 KiB |
Loading…
Add table
Add a link
Reference in a new issue