aboutsummaryrefslogtreecommitdiff
path: root/host/matelight.py
diff options
context:
space:
mode:
Diffstat (limited to 'host/matelight.py')
-rw-r--r--host/matelight.py40
1 files changed, 25 insertions, 15 deletions
diff --git a/host/matelight.py b/host/matelight.py
index 7c4f6c4..1bafe66 100644
--- a/host/matelight.py
+++ b/host/matelight.py
@@ -1,7 +1,8 @@
-import usb
import colorsys
-import numpy as np
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
CRATE_WIDTH = 5
CRATE_HEIGHT = 4
@@ -10,25 +11,34 @@ CRATES_Y = 4
DISPLAY_WIDTH = CRATES_X*CRATE_WIDTH
DISPLAY_HEIGHT = CRATES_Y*CRATE_HEIGHT
-FRAME_SIZE = CRATE_WIDTH*CRATE_HEIGHT*3
+CRATE_SIZE = CRATE_WIDTH*CRATE_HEIGHT*3
+FRAME_SIZE = DISPLAY_WIDTH*DISPLAY_HEIGHT
+
+# Gamma factor
+GAMMA = 2.5
+
+# Brightness of the LEDs in percent. 1.0 means 100%.
+BRIGHTNESS = 1.0
+
+ml = CDLL('./libml.so')
+ml.matelight_open.restype = c_void_p
-dev = usb.core.find(idVendor=0x1cbe, idProduct=0x0003)
+if ml.matelight_usb_init():
+ raise OSError('Cannot initialize USB library')
+matelights = ml.matelight_open()
+if matelights is None:
+ raise ImportError('Cannot open any Mate Light devices')
+dbuf = np.zeros(DISPLAY_WIDTH*DISPLAY_HEIGHT*4, dtype=np.uint8)
def sendframe(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.
"""
- # Gamma correction
- framedata = (((framedata/255) ** 2.5) * 255).astype(np.uint8)
- for cx, cy in product(range(CRATES_X), range(CRATES_Y)):
- datar = framedata[cy*CRATE_HEIGHT:(cy+1)*CRATE_HEIGHT, cx*CRATE_WIDTH:(cx+1)*CRATE_WIDTH, :3]
- data = datar.flat
- if len(data) != FRAME_SIZE:
- raise ValueError('Invalid frame data. Expected {} bytes, got {}.'.format(FRAME_SIZE, len(data)))
- # Send framebuffer data
- dev.write(0x01, bytes([0, cx, cy])+bytes(data))
- # Send latch command
- dev.write(0x01, b'\x01')
+ # just use the first Mate Light available
+ rgba = len(framedata) == DISPLAY_WIDTH*DISPLAY_HEIGHT*4
+ global dbuf
+ np.copyto(dbuf[:640*(3+rgba)], np.frombuffer(framedata, dtype=np.uint8))
+ ml.matelight_send_frame(matelights, dbuf.ctypes.data_as(POINTER(c_uint8)), c_size_t(CRATES_X), c_size_t(CRATES_Y), c_float(BRIGHTNESS), rgba)