コード例 #1
0
ファイル: gui_handler.py プロジェクト: jowlo/esp8266-pwm
    def __init__(self, builder):
        self.builder = builder
        self.cardstring = "front:CARD=CODEC,DEV=0"

        self.controller = LED_Controller(10, "192.168.4.1", 5555)

        self.fft_bars = [builder.get_object("fft_bar_" + str(i)) for i in range(40)]

        self.fft_timeout = GObject.timeout_add(50, self.fft_callback, None)
        self.state_timeout = GObject.timeout_add(30, self.state_update, None)

        self.fft_darea = self.builder.get_object("fft_drawing_area")
        self.state_darea = self.builder.get_object("state_drawing_area")
        self.chart = None
        self.strip_display = None

        self.provider = None

        self.relaxation_box = self.builder.get_object("relaxation_frame_count")

        self.pcm_chooser = builder.get_object("pcm_combo_box")
        for pcm in FFT.available_pcms():
            self.pcm_chooser.append_text(pcm)

        self.grouper = Grouper(self.controller.strips, self)

        self.strobes = [Strobe(self)]

        self.fft_effect_chooser = builder.get_object("fft_effect_combo")
        self.effects = {cls.__name__: cls for cls in ToStateProcessor.__subclasses__()}
        for effect in self.effects.keys():
            self.fft_effect_chooser.append_text(effect)
        self.fft_effect_chooser.set_entry_text_column(0)
        self.fft_effect_chooser.set_active(0)
        self.builder.get_object("fft_rescale_button").set_sensitive(False)
        self.builder.get_object("fft_channel_scale").set_sensitive(True)

        self.send_static()
コード例 #2
0
ファイル: gui_handler.py プロジェクト: jowlo/esp8266-pwm
class Handler:
    def __init__(self, builder):
        self.builder = builder
        self.cardstring = "front:CARD=CODEC,DEV=0"

        self.controller = LED_Controller(10, "192.168.4.1", 5555)

        self.fft_bars = [builder.get_object("fft_bar_" + str(i)) for i in range(40)]

        self.fft_timeout = GObject.timeout_add(50, self.fft_callback, None)
        self.state_timeout = GObject.timeout_add(30, self.state_update, None)

        self.fft_darea = self.builder.get_object("fft_drawing_area")
        self.state_darea = self.builder.get_object("state_drawing_area")
        self.chart = None
        self.strip_display = None

        self.provider = None

        self.relaxation_box = self.builder.get_object("relaxation_frame_count")

        self.pcm_chooser = builder.get_object("pcm_combo_box")
        for pcm in FFT.available_pcms():
            self.pcm_chooser.append_text(pcm)

        self.grouper = Grouper(self.controller.strips, self)

        self.strobes = [Strobe(self)]

        self.fft_effect_chooser = builder.get_object("fft_effect_combo")
        self.effects = {cls.__name__: cls for cls in ToStateProcessor.__subclasses__()}
        for effect in self.effects.keys():
            self.fft_effect_chooser.append_text(effect)
        self.fft_effect_chooser.set_entry_text_column(0)
        self.fft_effect_chooser.set_active(0)
        self.builder.get_object("fft_rescale_button").set_sensitive(False)
        self.builder.get_object("fft_channel_scale").set_sensitive(True)

        self.send_static()


    def fft_draw(self, wid, ctx):
        if self.controller.fft is None:
            self.fft_darea.set_size_request(600, 400)
            self.chart = BarChart(40, ctx, 600, 400)
            self.chart.draw([0] * 40)
            return
        self.fft_darea.set_size_request(600, 400)
        self.chart = BarChart(40, ctx, 600, 400)
        self.chart.threshold = self.provider.threshold
        self.chart.draw([self.provider.scale * i for i in self.controller.fft.intensity()])
        wid.queue_draw()

    def gtk_main_quit(self, *args):
        for strobe in self.strobes:
            strobe.kill()
        GObject.source_remove(self.fft_timeout)
        GObject.source_remove(self.state_timeout)
        self.controller.stop_all_threads()
        Gtk.main_quit(*args)

    def pcm_chooser_clicked(self, button):
        for pcm in FFT.available_pcms():
            self.pcm_chooser.append_text(pcm)

    def nav_change(self, selection):
        model, treeiter = selection.get_selected()
        if treeiter != None:
            print("You selected", model[treeiter][0])

    def send_static(self, *args):
        colorchooser = self.builder.get_object("color_static")
        color = colorchooser.get_rgba()
        color = [color.red, color.green, color.blue]
        self.controller.full_color(color)
        def generator():
            while True:
                yield self.controller.state_factory.full_color(color)
        self.controller.network.generator = generator()
        print(color)

    def fft_callback(self, user_data):
        if self.controller.fft is None:
            return True
        intensity = self.controller.fft.intensity()
        for bar, value in zip(self.fft_bars, intensity):
            bar.set_value(max(0.1, value/100))
        if self.chart:
            self.chart.draw([self.provider.scale * i for i in intensity])
        return True

    def state_draw(self, wid, ctx):
        self.state_darea.set_size_request(20, 200)
        self.strip_display = StripDisplay(10, self.controller.network.state, ctx)
        self.strip_display.draw()
        wid.queue_draw()

    def state_update(self, data):
        if self.strip_display:
            self.strip_display.draw()

    def update_groups(self):
        pass

    def fft_state(self, button, none):
        if self.builder.get_object("fft_state_switch").get_active():
            self.cardstring = self.pcm_chooser.get_active_text()
            if self.controller.fft is None:
                self.controller.fft = FFT(self.cardstring)
                self.pcm_chooser.set_sensitive(False)
            self.controller.fft.start_analyse_thread()
            self.fft_start(button)
            self.fft_darea.queue_draw()
            self.builder.get_object("fft_rescale_button").set_sensitive(True)
        else:
            self.controller.network.stop_sender_thread()
            self.controller.fft.stop_analyse_thread()
            self.pcm_chooser.set_sensitive(True)
            self.builder.get_object("fft_rescale_button").set_sensitive(False)

    def fft_start(self, button):
        self.builder.get_object("fft_rescale_button").set_sensitive(True)
        self.update_fft_effect()

    def update_fft_effect(self):
        def color_provider():
            c = self.builder.get_object("color_static").get_rgba()
            return [c.red, c.green, c.blue]

        def rainbow_provider():
            for i in self.controller.color.rainbow_colors():
                print(i)
                yield i

        relax_value = int(self.relaxation_box.get_text())

        relax = Relaxation(self.controller, self.controller.fft.intensity, relax_value)
        print(relax)
        print(str(self.fft_effect_chooser.get_active_text()))
        effect_class = self.effects[self.fft_effect_chooser.get_active_text()] # i.e. PulseColor
        self.provider = effect_class(self.controller, relax.process, self.controller.state_factory.state_off)
        self.controller.network.generator = self.provider.process(color_provider)
        self.controller.network.start_sender_thread()
        # time.sleep(1)

    def relax_value_changed_cb(self, text):
        if self.relaxation_box.get_text() != '':
            self.update_fft_effect()
        return True

    def fft_decay_value_changed_cb(self, scale):
        self.provider.decay = scale.get_value()
        return True

    def fft_scale_value_changed_cb(self, scale):
        self.provider.scale = scale.get_value()
        return True

    def fft_threshold_value_changed_cb(self, scale):
        self.provider.threshold = scale.get_value()
        self.chart.threshold = scale.get_value()
        return True

    def fft_channel_changed(self, scale):
        if self.provider:
            self.provider.channel = int(scale.get_value())
        return True

    def fft_effect_changed(self, effect):
        if self.builder.get_object("fft_state_switch").get_active():
            self.update_fft_effect()
        return True

    def fft_rescale_button_clicked_cb(self, button):
        print("Rescaling FFT...")
        self.controller.fft.rescale()
        return True

    def strobe_add_button_clicked_cb(self, button):
        self.strobes.append(Strobe(self))