38 lines
1.3 KiB
Python
38 lines
1.3 KiB
Python
import colorsys
|
|
from itertools import product
|
|
from ctypes import c_size_t, c_uint8, c_void_p, c_float, CDLL, Structure, POINTER
|
|
import numpy as np
|
|
import time
|
|
import atexit
|
|
|
|
import config
|
|
|
|
ml = CDLL('./libml.so')
|
|
ml.matelight_open.restype = c_void_p
|
|
|
|
if ml.matelight_usb_init():
|
|
raise OSError('Cannot initialize USB library')
|
|
|
|
atexit.register(ml.matelight_usb_destroy)
|
|
|
|
class Matelight:
|
|
def __init__(self, match_serial=None):
|
|
""" Open the matelight matching the USB serial number given as a bytes object. If match_serial is None, open the
|
|
first matelight """
|
|
self.handle = ml.matelight_open(match_serial)
|
|
self.dbuf = np.zeros(config.frame_size*4, dtype=np.uint8)
|
|
if self.handle is None:
|
|
raise ValueError('Cannot find requested matelight.')
|
|
|
|
def sendframe(self, framedata):
|
|
""" Send a frame to the display
|
|
|
|
The argument contains a h * w array of 3-tuples of (r, g, b)-data or 4-tuples of (r, g, b, a)-data where the a
|
|
channel is ignored.
|
|
"""
|
|
# just use the first Mate Light available
|
|
rgba = len(framedata) == config.frame_size*4
|
|
np.copyto(self.dbuf[:640*(3+rgba)], np.frombuffer(framedata, dtype=np.uint8))
|
|
ml.matelight_send_frame(self.handle, self.dbuf.ctypes.data_as(POINTER(c_uint8)), c_size_t(config.crates_x),
|
|
c_size_t(config.crates_y), c_float(config.brightness), rgba)
|
|
|