示例#1
0
文件: ccgui.py 项目: sumchege/miniecu
    def __init__(self):
        builder = get_builder('ccgui.ui')
        self.window = builder.get_object('ccgui_window')
        builder.connect_signals(self)

        self.rpm_gauge = GtkGauge()
        self.rpm_gauge.name = 'RPM\n<span foreground="orange"><i><small>x1000</small></i></span>'
        self.rpm_gauge.start_value = 0
        self.rpm_gauge.end_value = 10
        self.rpm_gauge.initial_step = 1
        self.rpm_gauge.sub_step = 0.2
        self.rpm_gauge.drawing_step = 1
        self.rpm_gauge.strip_color_order = 'GYR'
        self.rpm_gauge.green_strip_start = 0
        self.rpm_gauge.yellow_strip_start = 7
        self.rpm_gauge.red_strip_start = 8
        self.rpm_gauge.smooth_interval = 50

        self.temp_gauge = GtkGauge()
        self.temp_gauge.name = 'Temp\n<span foreground="orange"><i>°C</i></span>'
        self.temp_gauge.start_value = 0
        self.temp_gauge.end_value = 130
        self.temp_gauge.initial_step = 10
        self.temp_gauge.sub_step = 2.0
        self.temp_gauge.drawing_step = 20
        self.temp_gauge.strip_color_order = 'GYR'
        self.temp_gauge.green_strip_start = 0
        self.temp_gauge.yellow_strip_start = 100
        self.temp_gauge.red_strip_start = 110
        self.temp_gauge.smooth_interval = 50

        self.batt_gauge = GtkGauge()
        self.batt_gauge.name = 'Battery\n<span foreground="orange"><i>V</i></span>'
        self.batt_gauge.start_value = 0
        self.batt_gauge.end_value = 12
        self.batt_gauge.initial_step = 1
        self.batt_gauge.sub_step = 0.2
        self.batt_gauge.drawing_step = 2
        self.batt_gauge.strip_color_order = 'RYG'
        self.batt_gauge.green_strip_start = 5
        self.batt_gauge.yellow_strip_start = 4
        self.batt_gauge.red_strip_start = 0
        self.batt_gauge.smooth_interval = 50

        gbox = builder.get_object('gauge_box')
        gbox.pack_start(self.rpm_gauge, True, True, 0)
        gbox.pack_start(self.temp_gauge, True, True, 0)
        gbox.pack_start(self.batt_gauge, True, True, 0)

        # Status message tree view
        self.status_treeview = builder.get_object('status_treeview')
        self.status_store = Gtk.ListStore(str, str)
        self.status_treeview.set_model(self.status_store)
        renderer1 = Gtk.CellRendererText()
        renderer2 = Gtk.CellRendererText()
        column1 = Gtk.TreeViewColumn("Field", renderer1, text=0)
        column2 = Gtk.TreeViewColumn("Value", renderer2, text=1)
        self.status_treeview.append_column(column1)
        self.status_treeview.append_column(column2)

        self.window.set_default_size(640, 480)
        self.window.show_all()

        # store ref to some widgets
        self.param_listbox = builder.get_object('param_listbox')
        self.status_bar = builder.get_object('status_bar')
        self.ignition_switch = builder.get_object('ignition_switch')
        self.starter_switch = builder.get_object('starter_switch')

        # param widgets
        self.param_rows = {}

        # connect model signals
        ParamManager().sig_changed.connect(self.update_params)
        StatusManager().sig_changed.connect(self.update_status)
        StatusTextManager().sig_changed.connect(self.update_statustext)
示例#2
0
文件: ccgui.py 项目: sumchege/miniecu
class CCGuiApplication(object):
    def __init__(self):
        builder = get_builder('ccgui.ui')
        self.window = builder.get_object('ccgui_window')
        builder.connect_signals(self)

        self.rpm_gauge = GtkGauge()
        self.rpm_gauge.name = 'RPM\n<span foreground="orange"><i><small>x1000</small></i></span>'
        self.rpm_gauge.start_value = 0
        self.rpm_gauge.end_value = 10
        self.rpm_gauge.initial_step = 1
        self.rpm_gauge.sub_step = 0.2
        self.rpm_gauge.drawing_step = 1
        self.rpm_gauge.strip_color_order = 'GYR'
        self.rpm_gauge.green_strip_start = 0
        self.rpm_gauge.yellow_strip_start = 7
        self.rpm_gauge.red_strip_start = 8
        self.rpm_gauge.smooth_interval = 50

        self.temp_gauge = GtkGauge()
        self.temp_gauge.name = 'Temp\n<span foreground="orange"><i>°C</i></span>'
        self.temp_gauge.start_value = 0
        self.temp_gauge.end_value = 130
        self.temp_gauge.initial_step = 10
        self.temp_gauge.sub_step = 2.0
        self.temp_gauge.drawing_step = 20
        self.temp_gauge.strip_color_order = 'GYR'
        self.temp_gauge.green_strip_start = 0
        self.temp_gauge.yellow_strip_start = 100
        self.temp_gauge.red_strip_start = 110
        self.temp_gauge.smooth_interval = 50

        self.batt_gauge = GtkGauge()
        self.batt_gauge.name = 'Battery\n<span foreground="orange"><i>V</i></span>'
        self.batt_gauge.start_value = 0
        self.batt_gauge.end_value = 12
        self.batt_gauge.initial_step = 1
        self.batt_gauge.sub_step = 0.2
        self.batt_gauge.drawing_step = 2
        self.batt_gauge.strip_color_order = 'RYG'
        self.batt_gauge.green_strip_start = 5
        self.batt_gauge.yellow_strip_start = 4
        self.batt_gauge.red_strip_start = 0
        self.batt_gauge.smooth_interval = 50

        gbox = builder.get_object('gauge_box')
        gbox.pack_start(self.rpm_gauge, True, True, 0)
        gbox.pack_start(self.temp_gauge, True, True, 0)
        gbox.pack_start(self.batt_gauge, True, True, 0)

        # Status message tree view
        self.status_treeview = builder.get_object('status_treeview')
        self.status_store = Gtk.ListStore(str, str)
        self.status_treeview.set_model(self.status_store)
        renderer1 = Gtk.CellRendererText()
        renderer2 = Gtk.CellRendererText()
        column1 = Gtk.TreeViewColumn("Field", renderer1, text=0)
        column2 = Gtk.TreeViewColumn("Value", renderer2, text=1)
        self.status_treeview.append_column(column1)
        self.status_treeview.append_column(column2)

        self.window.set_default_size(640, 480)
        self.window.show_all()

        # store ref to some widgets
        self.param_listbox = builder.get_object('param_listbox')
        self.status_bar = builder.get_object('status_bar')
        self.ignition_switch = builder.get_object('ignition_switch')
        self.starter_switch = builder.get_object('starter_switch')

        # param widgets
        self.param_rows = {}

        # connect model signals
        ParamManager().sig_changed.connect(self.update_params)
        StatusManager().sig_changed.connect(self.update_status)
        StatusTextManager().sig_changed.connect(self.update_statustext)

    def on_ccgui_window_delete_event(self, *args):
        logging.info("onQuit")
        Gtk.main_quit(*args)

    def on_connect_activate(self, *args):
        logging.debug("onConnect")
        dialog = ConnDialog()
        if dialog.run() == Gtk.ResponseType.OK:
            args = dialog.get_result_destroy()
            self.create_comm(*args)

    def on_disconnect_activate(self, *args):
        logging.debug("onDisConnect")
        CommManager().clear()
        logging.info("DEV: closed")

    def create_comm(self, port, baudrate, engine_id, log_db, log_name):
        try:
            CommManager().clear()
            CommManager().register(CommThread(port, baudrate, engine_id, log_db, log_name))
            logging.info("DEV: %s: opened", port)
            TimeRefManager().start()
            ParamManager().retrieve_all()
        except serial.SerialException as ex:
            logging.error("DEV: %s: %s", port, repr(ex))

    def on_param_request_clicked(self, *args):
        logging.debug("onParamRequest")

        ParamManager().retrieve_all()

    def on_param_send_clicked(self, *args):
        logging.debug("onParamSend")

        ParamManager().sync()

    def on_param_load_clicked(self, *args):
        logging.debug("onParamLoad")

        if CommandManger().load_config():
            ParamManager().retrieve_all()

    def on_param_save_clicked(self, *args):
        logging.debug("onParamSave")

        ParamManager().sync()
        CommandManger().save_config()

    def on_ignition_switch_active_notify(self, switch, *args):
        logging.debug("onIgnitionActivate")

        if switch.get_active():
            CommandManger().ignition_enable()
        else:
            CommandManger().ignition_disable()

    def on_starter_switch_active_notify(self, switch, *args):
        logging.debug("onStarterActivete")

        if switch.get_active():
            CommandManger().starter_enable()
        else:
            CommandManger().starter_disable()

    def update_params(self, **kvargs):
        """Param update slot"""
        for k, p in sorted(ParamManager().parameters.iteritems()):
            row = self.param_rows.get(k)
            if row:
                row.update()
            else:
                row = ParamBoxRow(p)
                self.param_rows[k] = row
                self.param_listbox.add(row)

        # TODO: recalculate gauge min/max and strip position by
        # RPM_LIMIT, BATT_TYPE, BATT_CELLS, TEMP_OVERHEAT

        # remove old rows
        for k, row in self.param_rows.items():
            if not ParamManager().parameters.has_key(k):
                self.param_listbox.remove(row)
                del self.param_rows[k]

    def update_status(self, **kvargs):
        status = StatusManager().last_message
        # logging.debug(str(status))
        logging.debug("status timestamp_ms: %s", status.timestamp_ms)

        self.update_rpm_value(status.rpm)
        self.update_temp_value(status.temperature.engine1)
        self.update_batt_value(status.battery.voltage)

        def update_field(filed, val):
            s_val = status_str(filed, val)
            for it in self.status_store:
                if it[0] == filed:
                    it[1] = s_val
                    return

            self.status_store.append([filed, s_val])

        for filed, val in pb_to_kv_pairs(status):
            # logging.debug("f: %s = %s: %s", filed, str(val), status_str(filed, val))
            update_field(filed, val)
            # TODO: remove old fileds (but simple .clear() does SIGFAULT)

    def update_rpm_value(self, val):
        # RPM gauge is 1/1000 of val
        val /= 1000.0
        self.rpm_gauge.set_value(val)

    def update_temp_value(self, val):
        # TEMP gauge in C, val in mC
        val = val / 1000.0
        self.temp_gauge.set_value(val)

    def update_batt_value(self, val):
        # BATT gauge in V, val in mV
        val = val / 1000.0
        self.batt_gauge.set_value(val)

    def update_statustext(self, **kvargs):
        ctx_id = self.status_bar.get_context_id("ECU")
        t, msg = StatusTextManager().last_message
        self.status_bar.push(ctx_id, "%s: %s: %s" % (
            t, msgs.StatusText.Severity.Name(msg.severity), msg.text))