class RGBLEDMatrix(COMCUPluginBase, Ui_RGBLEDMatrix): qtcb_frame_started = pyqtSignal(int) STATE_IDLE = 0 STATE_COLOR_GRADIENT = 3 STATE_COLOR_DOT = 4 STATE_COLOR_SCRIBBLE = 5 def __init__(self, *args): COMCUPluginBase.__init__(self, BrickletRGBLEDMatrix, *args) self.setupUi(self) self.rgb_led_matrix = self.device self.color_button = QColorButton() self.below_scribble_layout.insertWidget(2, self.color_button) self.scribble_widget = ScribbleWidget(8, 8, 35, self.color_button.color(), QColor(Qt.black)) def set_state_scribble(): self.state = self.STATE_COLOR_SCRIBBLE self.scribble_widget.scribbling_started.connect(set_state_scribble) self.scribble_layout.insertWidget(1, self.scribble_widget) self.qtcb_frame_started.connect(self.cb_frame_started) self.color_button.colorChanged.connect(self.color_changed) self.button_clear_drawing.clicked.connect(self.scribble_widget.clear_image) self.button_drawing.clicked.connect(self.drawing_clicked) self.button_color.clicked.connect(self.color_clicked) self.button_gradient.clicked.connect(self.gradient_clicked) self.button_dot.clicked.connect(self.dot_clicked) self.box_frame_duration.valueChanged.connect(self.frame_duration_changed) self.state = self.STATE_IDLE self.gradient_counter = 0 self.dot_counter = 0 self.dot_direction = 1 self.voltage = 0 self.cbe_supply_voltage = CallbackEmulator(self.rgb_led_matrix.get_supply_voltage, None, self.cb_supply_voltage, self.increase_error_count) def set_rgb(self, r, g, b): async_call(self.rgb_led_matrix.set_red, r, None, self.increase_error_count) async_call(self.rgb_led_matrix.set_green, g, None, self.increase_error_count) async_call(self.rgb_led_matrix.set_blue, b, None, self.increase_error_count) def cb_supply_voltage(self, voltage): self.label_voltage.setText(str(voltage / 1000.0) + 'V') def cb_frame_started(self): if self.state == self.STATE_COLOR_GRADIENT: self.render_color_gradient() elif self.state == self.STATE_COLOR_DOT: self.render_color_dot() elif self.state == self.STATE_COLOR_SCRIBBLE: self.render_color_scribble() def color_changed(self): self.scribble_widget.set_foreground_color(self.color_button.color()) def frame_duration_changed(self, duration): async_call(self.rgb_led_matrix.set_frame_duration, duration, None, self.increase_error_count) def drawing_clicked(self): old_state = self.state self.state = self.STATE_COLOR_SCRIBBLE if old_state == self.STATE_IDLE: self.render_color_scribble() def color_clicked(self): old_state = self.state self.state = self.STATE_COLOR_SCRIBBLE self.scribble_widget.fill_image(self.color_button.color()) if old_state == self.STATE_IDLE: self.render_color_scribble() def gradient_clicked(self): old_state = self.state self.state = self.STATE_COLOR_GRADIENT if old_state == self.STATE_IDLE: self.render_color_gradient() def dot_clicked(self): self.dot_counter = 0 self.dot_direction = 1 old_state = self.state self.state = self.STATE_COLOR_DOT if old_state == self.STATE_IDLE: self.render_color_dot() def render_color_scribble(self): r = [] g = [] b = [] for i in range(8): for j in range(8): color = QColor(self.scribble_widget.image().pixel(j, i)) r.append(color.red()) g.append(color.green()) b.append(color.blue()) self.set_rgb(r, g, b) def render_color_gradient(self): self.gradient_counter += NUM_LEDS * self.box_speed.value() / 100.0 / 4.0 ra = [] ga = [] ba = [] range_leds = list(range(NUM_LEDS)) range_leds = range_leds[int(self.gradient_counter) % NUM_LEDS:] + range_leds[:int(self.gradient_counter) % NUM_LEDS] range_leds = reversed(range_leds) for i in range_leds: r, g, b = colorsys.hsv_to_rgb(1.0*i/NUM_LEDS, 1, 0.2) ra.append(int(r*255)) ga.append(int(g*255)) ba.append(int(b*255)) self.scribble_widget.array_draw(ra, ga, ba, 4) self.set_rgb(ra, ga, ba) def render_color_dot(self): color = self.color_button.color() r = color.red() g = color.green() b = color.blue() self.dot_counter = self.dot_counter % NUM_LEDS index = self.dot_counter line = self.dot_counter // 8 if line % 2: index = line*8 + (7 - (self.dot_counter % 8)) r_val = [0]*NUM_LEDS g_val = [0]*NUM_LEDS b_val = [0]*NUM_LEDS r_val[index] = r g_val[index] = g b_val[index] = b self.scribble_widget.array_draw(r_val, g_val, b_val) self.set_rgb(r_val, g_val, b_val) self.dot_counter += self.dot_direction * self.box_speed.value() if self.dot_counter >= NUM_LEDS: self.dot_direction = -1 self.dot_counter = NUM_LEDS - 1 elif self.dot_counter < 0: self.dot_direction = 1 self.dot_counter = 0 def start(self): self.rgb_led_matrix.register_callback(self.rgb_led_matrix.CALLBACK_FRAME_STARTED, self.qtcb_frame_started.emit) self.cbe_supply_voltage.set_period(250) async_call(self.rgb_led_matrix.set_frame_duration, self.box_frame_duration.value(), None, self.increase_error_count) def stop(self): self.rgb_led_matrix.register_callback(self.rgb_led_matrix.CALLBACK_FRAME_STARTED, None) self.cbe_supply_voltage.set_period(0) async_call(self.rgb_led_matrix.set_frame_duration, 0, None, self.increase_error_count) def destroy(self): pass @staticmethod def has_device_identifier(device_identifier): return device_identifier == BrickletRGBLEDMatrix.DEVICE_IDENTIFIER
class RGBLEDMatrix(COMCUPluginBase, Ui_RGBLEDMatrix): qtcb_frame_started = pyqtSignal(int) STATE_IDLE = 0 STATE_COLOR_GRADIENT = 3 STATE_COLOR_DOT = 4 STATE_COLOR_SCRIBBLE = 5 def __init__(self, *args): COMCUPluginBase.__init__(self, BrickletRGBLEDMatrix, *args) self.setupUi(self) self.rgb_led_matrix = self.device self.color_button = QColorButton() self.below_scribble_layout.insertWidget(2, self.color_button) self.scribble_widget = ScribbleWidget(8, 8, 35, self.color_button.color(), QColor(Qt.black)) def set_state_scribble(): self.state = self.STATE_COLOR_SCRIBBLE self.scribble_widget.scribbling_started.connect(set_state_scribble) self.scribble_layout.insertWidget(1, self.scribble_widget) self.qtcb_frame_started.connect(self.cb_frame_started) self.color_button.colorChanged.connect(self.color_changed) self.button_clear_drawing.clicked.connect( self.scribble_widget.clear_image) self.button_drawing.clicked.connect(self.drawing_clicked) self.button_color.clicked.connect(self.color_clicked) self.button_gradient.clicked.connect(self.gradient_clicked) self.button_dot.clicked.connect(self.dot_clicked) self.box_frame_duration.valueChanged.connect( self.frame_duration_changed) self.state = self.STATE_IDLE self.gradient_counter = 0 self.dot_counter = 0 self.dot_direction = 1 self.voltage = 0 self.cbe_supply_voltage = CallbackEmulator( self, self.rgb_led_matrix.get_supply_voltage, None, self.cb_supply_voltage, self.increase_error_count) def set_rgb(self, r, g, b): async_call(self.rgb_led_matrix.set_red, r, None, self.increase_error_count) async_call(self.rgb_led_matrix.set_green, g, None, self.increase_error_count) async_call(self.rgb_led_matrix.set_blue, b, None, self.increase_error_count) def cb_supply_voltage(self, voltage): self.label_voltage.setText(str(voltage / 1000.0) + 'V') def cb_frame_started(self): if self.state == self.STATE_COLOR_GRADIENT: self.render_color_gradient() elif self.state == self.STATE_COLOR_DOT: self.render_color_dot() elif self.state == self.STATE_COLOR_SCRIBBLE: self.render_color_scribble() def color_changed(self): self.scribble_widget.set_foreground_color(self.color_button.color()) def frame_duration_changed(self, duration): async_call(self.rgb_led_matrix.set_frame_duration, duration, None, self.increase_error_count) def drawing_clicked(self): old_state = self.state self.state = self.STATE_COLOR_SCRIBBLE if old_state == self.STATE_IDLE: self.render_color_scribble() def color_clicked(self): old_state = self.state self.state = self.STATE_COLOR_SCRIBBLE self.scribble_widget.fill_image(self.color_button.color()) if old_state == self.STATE_IDLE: self.render_color_scribble() def gradient_clicked(self): old_state = self.state self.state = self.STATE_COLOR_GRADIENT if old_state == self.STATE_IDLE: self.render_color_gradient() def dot_clicked(self): self.dot_counter = 0 self.dot_direction = 1 old_state = self.state self.state = self.STATE_COLOR_DOT if old_state == self.STATE_IDLE: self.render_color_dot() def render_color_scribble(self): r = [] g = [] b = [] for i in range(8): for j in range(8): color = QColor(self.scribble_widget.image().pixel(j, i)) r.append(color.red()) g.append(color.green()) b.append(color.blue()) self.set_rgb(r, g, b) def render_color_gradient(self): self.gradient_counter += NUM_LEDS * self.box_speed.value( ) / 100.0 / 4.0 ra = [] ga = [] ba = [] range_leds = list(range(NUM_LEDS)) range_leds = range_leds[ int(self.gradient_counter) % NUM_LEDS:] + range_leds[:int(self.gradient_counter) % NUM_LEDS] range_leds = reversed(range_leds) for i in range_leds: r, g, b = colorsys.hsv_to_rgb(1.0 * i / NUM_LEDS, 1, 0.2) ra.append(int(r * 255)) ga.append(int(g * 255)) ba.append(int(b * 255)) self.scribble_widget.array_draw(ra, ga, ba, 4) self.set_rgb(ra, ga, ba) def render_color_dot(self): color = self.color_button.color() r = color.red() g = color.green() b = color.blue() self.dot_counter = self.dot_counter % NUM_LEDS index = self.dot_counter line = self.dot_counter // 8 if line % 2: index = line * 8 + (7 - (self.dot_counter % 8)) r_val = [0] * NUM_LEDS g_val = [0] * NUM_LEDS b_val = [0] * NUM_LEDS r_val[index] = r g_val[index] = g b_val[index] = b self.scribble_widget.array_draw(r_val, g_val, b_val) self.set_rgb(r_val, g_val, b_val) self.dot_counter += self.dot_direction * self.box_speed.value() if self.dot_counter >= NUM_LEDS: self.dot_direction = -1 self.dot_counter = NUM_LEDS - 1 elif self.dot_counter < 0: self.dot_direction = 1 self.dot_counter = 0 def start(self): self.rgb_led_matrix.register_callback( self.rgb_led_matrix.CALLBACK_FRAME_STARTED, self.qtcb_frame_started.emit) self.cbe_supply_voltage.set_period(250) async_call(self.rgb_led_matrix.set_frame_duration, self.box_frame_duration.value(), None, self.increase_error_count) def stop(self): self.rgb_led_matrix.register_callback( self.rgb_led_matrix.CALLBACK_FRAME_STARTED, None) self.cbe_supply_voltage.set_period(0) async_call(self.rgb_led_matrix.set_frame_duration, 0, None, self.increase_error_count) def destroy(self): pass @staticmethod def has_device_identifier(device_identifier): return device_identifier == BrickletRGBLEDMatrix.DEVICE_IDENTIFIER
class EPaper296x128(COMCUPluginBase, Ui_EPaper296x128): def __init__(self, *args): COMCUPluginBase.__init__(self, BrickletEPaper296x128, *args) self.setupUi(self) self.epaper = self.device self.scribble_widget = ScribbleWidget(WIDTH, HEIGHT, 2, QColor(Qt.white), QColor(Qt.black), enable_grid=False) self.image_button_layout.insertWidget(0, self.scribble_widget) self.draw_button.clicked.connect(self.draw_clicked) self.send_button.clicked.connect(self.send_clicked) self.fill_black_button.clicked.connect(lambda: self.fill_clicked(0)) self.fill_white_button.clicked.connect(lambda: self.fill_clicked(1)) self.fill_red_button.clicked.connect(lambda: self.fill_clicked(2)) self.color_radio_black.toggled.connect(self.radio_toggled) self.color_radio_white.toggled.connect(self.radio_toggled) self.color_radio_red.toggled.connect(self.radio_toggled) self.display_type = self.epaper.DISPLAY_TYPE_BLACK_WHITE_RED def radio_toggled(self): if self.color_radio_black.isChecked(): self.scribble_widget.set_foreground_color(QColor(Qt.black)) elif self.color_radio_white.isChecked(): self.scribble_widget.set_foreground_color(QColor(Qt.white)) elif self.color_radio_red.isChecked(): if self.display_type == self.epaper.DISPLAY_TYPE_BLACK_WHITE_RED: self.scribble_widget.set_foreground_color(QColor(Qt.red)) else: self.scribble_widget.set_foreground_color(QColor(Qt.darkGray)) def fill_clicked(self, color): self.epaper.fill_display(color) self.start() def send_clicked(self): pos_x = self.posx_spinbox.value() pos_y = self.posy_spinbox.value() font = self.font_combo.currentIndex() color = self.color_combo.currentIndex() orien = self.orientation_combo.currentIndex() text = self.text_edit.text() self.epaper.draw_text(pos_x, pos_y, font, color, orien, text) self.start() def draw_clicked(self): bw = [False] * WIDTH * HEIGHT red = [False] * WIDTH * HEIGHT for i in range(HEIGHT): for j in range(WIDTH): if QColor(self.scribble_widget.image().pixel(j, i)) == Qt.white: bw[i * WIDTH + j] = True if QColor(self.scribble_widget.image().pixel(j, i)) in (Qt.red, Qt.darkGray): red[i * WIDTH + j] = True self.epaper.write_black_white(0, 0, WIDTH - 1, HEIGHT - 1, bw) self.epaper.write_color(0, 0, WIDTH - 1, HEIGHT - 1, red) self.epaper.draw() def read_black_white_async(self, pixels): for i in range(HEIGHT): for j in range(WIDTH): if pixels[i * WIDTH + j]: self.scribble_widget.image().setPixel(j, i, 0xFFFFFF) else: self.scribble_widget.image().setPixel(j, i, 0) async_call(self.epaper.read_color, (0, 0, WIDTH - 1, HEIGHT - 1), self.read_color_async, self.increase_error_count) def read_color_async(self, pixels): if pixels: for i in range(HEIGHT): for j in range(WIDTH): if pixels[i * WIDTH + j]: if self.display_type == self.epaper.DISPLAY_TYPE_BLACK_WHITE_RED: self.scribble_widget.image().setPixel(j, i, 0xFF0000) else: self.scribble_widget.image().setPixel(j, i, 0x808080) self.scribble_widget.update() def get_display_type_async(self, display_type): self.display_type = display_type if display_type == self.epaper.DISPLAY_TYPE_BLACK_WHITE_RED: color = 'Red' else: color = 'Grey' self.fill_red_button.setText('Fill ' + color) self.color_radio_red.setText(color) self.color_combo.removeItem(2) self.color_combo.insertItem(2, color) def start(self): async_call(self.epaper.get_display_type, None, self.get_display_type_async, self.increase_error_count) async_call(self.epaper.read_black_white, (0, 0, WIDTH - 1, HEIGHT - 1), self.read_black_white_async, self.increase_error_count) def stop(self): pass def destroy(self): pass @staticmethod def has_device_identifier(device_identifier): return device_identifier == BrickletEPaper296x128.DEVICE_IDENTIFIER