import display
+from typing import List, Tuple, Callable
+
class Renderer:
def __init__(self) -> None:
self.width = display.EPD_HEIGHT
self.height = display.EPD_WIDTH
self.display = display.Display()
+ self.rules: List[Tuple[Callable[[],bool],Callable[[int,int],Image]]] = [];
+ self._calibrate_before_next_render = False
+
+ def render(self):
+ # check for calibration first
+ if self._calibrate_before_next_render:
+ self._calibrate_before_next_render = False
+ self.display.calibrate()
- def render(self, image: Image):
+ for rule in self.rules:
+ if rule[0]():
+ self.render_image(rule[1](self.width, self.height))
+ return
+
+ def render_image(self, image: Image):
hsv_image = image.convert("HSV")
hsv_pixels = hsv_image.load()
h, s, v = hsv_pixels[x,y]
red_hue_val = max(0, 255 - h*6, (h-212)*6)
red_val = int(red_hue_val * s * v / 256 / 256)
+ black_val = int(255 * max(0, v - red_val) / max(1, 255 - red_val))
if red_val > 0:
- red_pixels[x, y] = 0 # 255 - red_val
- black_pixels[x, y] = (v, v, v)
+ red_pixels[x, y] = 255 - red_val
+ black_pixels[x, y] = 3*(black_val,)
black_image = black_image.transpose(Image.Transpose.ROTATE_270)
red_image = red_image.transpose(Image.Transpose.ROTATE_270)
self.display.render(black_image, red_image)
+ def set_calibrate_next_render(self, calibrate: bool = True) -> None:
+ self._calibrate_before_next_render = calibrate
+