コード例 #1
0
ファイル: rgb_led_matrix.py プロジェクト: Tinkerforge/brickv
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
コード例 #2
0
ファイル: rgb_led_matrix.py プロジェクト: fk0815/brickv
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
コード例 #3
0
ファイル: e_paper_296x128.py プロジェクト: fk0815/brickv
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