예제 #1
0
 def plot(e=None):
     import dyno
     d = dyno.DynoRun()
     d.Load("dustin.csv")
     d1 = dyno.DynoRun()
     d1.Load("dustin.csv")
     draw([d, d1])
예제 #2
0
    def plot_sample_data(self):
        import dyno
        r = dyno.DynoRun()
        r.Load("dustin.csv")

        import smooth
        r.Smooth(smooth.NNA)
        r.Smooth(smooth.box)
        self.plot([r.torque(), r.hp()], ["Torque", "Power"])
        self.toolbar.update()
예제 #3
0
    def LoadDyno(self, e=None):

        dlg = wx.FileDialog(self, "Choose a file", os.getcwd(), "",
                            DYNOFILETYPES, wx.OPEN)
        if dlg.ShowModal() == wx.ID_OK:
            path = dlg.GetPath()
            r = dyno.DynoRun()
            try:
                r.Load(path)
            except IOError, mesg:
                FileError(self, str(mesg))
                self.LoadDyno()
                return

            self.AddRun(r)
예제 #4
0
    def ImportDyno(self, e=None):
        class ImportDialog(wx.Dialog):
            def __init__(self,
                         parent,
                         ID,
                         title,
                         data,
                         pos=wx.DefaultPosition,
                         size=wx.DefaultSize,
                         style=wx.SYSTEM_MENU | wx.RESIZE_BORDER):
                pre = wx.PreDialog()
                pre.Create(parent, ID, title, pos, size, style)
                self.this = pre.this
                sizer = wx.BoxSizer(wx.VERTICAL)

                panel1 = wx.Panel(self, -1)
                panel1.SetAutoLayout(True)

                self.sample_data = parent.MyListCtrl(
                    panel1,
                    -1,
                    style=wx.LC_REPORT | wx.LC_HRULES | wx.LC_SINGLE_SEL)

                num_col = len(data[0])

                for i in range(0, num_col):
                    self.sample_data.InsertColumn(i, "Col %d" % i)

                for i in range(0, 5):
                    self.sample_data.InsertStringItem(i, str(data[i][0]))
                    for j in range(0, num_col):
                        self.sample_data.SetStringItem(i, j, str(data[i][j]))

                sizer.Add(panel1, 1, wx.EXPAND, 0)

                def OnPSize(e, win=panel1):
                    self.sample_data.SetSize(panel1.GetSize())

                wx.EVT_SIZE(panel1, OnPSize)

                ctrlsizer = wx.BoxSizer(wx.HORIZONTAL)

                col1 = wx.BoxSizer(wx.VERTICAL)

                rsizer = wx.BoxSizer(wx.HORIZONTAL)
                self.rpm = wx.Choice(self,
                                     -1,
                                     choices=map(str, range(0, num_col)))
                self.rpm.SetSelection(0)
                rsizer.Add(self.rpm, 0, 0, 0)
                txt = wx.StaticText(self, -1, "RPM Column")
                rsizer.Add(txt, 0, wx.WEST, 5)
                col1.Add(rsizer, 0, wx.SOUTH, 5)

                rsizer = wx.BoxSizer(wx.HORIZONTAL)
                self.afr = wx.Choice(self,
                                     -1,
                                     choices=map(str, range(0, num_col)))
                self.afr.SetSelection(0)
                rsizer.Add(self.afr, 0, 0, 0)
                txt = wx.StaticText(self, -1, "Wideband A/F:")
                rsizer.Add(txt, 0, wx.WEST, 5)
                col1.Add(rsizer, 0, wx.SOUTH, 5)

                rsizer = wx.BoxSizer(wx.HORIZONTAL)
                self.knock = wx.Choice(self,
                                       -1,
                                       choices=map(str, range(0, num_col)))
                self.knock.SetSelection(0)
                rsizer.Add(self.knock, 0, 0, 0)
                txt = wx.StaticText(self, -1, "Knock:")
                rsizer.Add(txt, 0, wx.WEST, 5)
                col1.Add(rsizer, 0, wx.SOUTH, 5)

                rsizer = wx.BoxSizer(wx.HORIZONTAL)
                self.ts = wx.Choice(self,
                                    -1,
                                    choices=map(str, range(0, num_col)))
                self.ts.SetSelection(0)
                rsizer.Add(self.ts, 0, 0, 0)
                txt = wx.StaticText(self, -1, "TimingShift:")
                rsizer.Add(txt, 0, wx.WEST, 5)
                col1.Add(rsizer, 0, wx.SOUTH, 5)

                col2 = wx.BoxSizer(wx.VERTICAL)
                # Time source selection
                time_box_title = wx.StaticBox(self, -1, "Power Calculation")
                time_box = wx.StaticBoxSizer(time_box_title, wx.VERTICAL)
                tb = wx.FlexGridSizer(0, 2, 0, 0)

                self.tsfd_radio = wx.RadioButton(self, -1,
                                                 " Timestamp from data ")
                self.sr_radio = wx.RadioButton(self, -1, " Samplerate ")
                self.tfd_radio = wx.RadioButton(self, -1, " Torque from data ")
                self.pfd_radio = wx.RadioButton(self, -1, " Power from data ")
                self.pfd_radio.Enable(False)
                self.time_ctrl1 = wx.Choice(self,
                                            -1,
                                            choices=map(
                                                str, range(0, num_col)))
                self.time_ctrl1.SetSelection(0)
                self.time_ctrl2 = IntCtrl(self, -1)
                self.time_ctrl2.Enable(False)

                self.torque_ctrl = wx.Choice(self,
                                             -1,
                                             choices=map(
                                                 str, range(0, num_col)))
                self.torque_ctrl.Enable(False)
                self.power_ctrl = wx.Choice(self,
                                            -1,
                                            choices=map(
                                                str, range(0, num_col)))
                self.power_ctrl.Enable(False)

                tb.Add(self.tsfd_radio, 1, wx.EAST | wx.NORTH | wx.SOUTH, 4)
                tb.Add(self.time_ctrl1, 1, wx.WEST | wx.NORTH | wx.SOUTH, 4)
                tb.Add(self.sr_radio, 1, wx.EAST | wx.NORTH | wx.SOUTH, 4)
                tb.Add(self.time_ctrl2, 1, wx.WEST | wx.NORTH | wx.SOUTH, 4)

                tb.Add(self.tfd_radio, 1, wx.EAST | wx.NORTH | wx.SOUTH, 4)
                tb.Add(self.torque_ctrl, 1, wx.WEST | wx.NORTH | wx.SOUTH, 4)
                tb.Add(self.pfd_radio, 1, wx.EAST | wx.NORTH | wx.SOUTH, 4)
                tb.Add(self.power_ctrl, 1, wx.WEST | wx.NORTH | wx.SOUTH, 4)

                time_box.Add(tb, 0, 0, 0)
                col2.Add(time_box, 0, 0, 0)

                def time_enable(evt):
                    self.time_ctrl1.Enable(False)
                    self.time_ctrl2.Enable(False)
                    self.torque_ctrl.Enable(False)
                    self.power_ctrl.Enable(False)

                    if self.tsfd_radio is evt.GetEventObject():
                        self.time_ctrl1.Enable(True)
                    elif self.sr_radio is evt.GetEventObject():
                        self.time_ctrl2.Enable(True)
                    elif self.tfd_radio is evt.GetEventObject():
                        self.torque_ctrl.Enable(True)
                    elif self.pfd_radio is evt.GetEventObject():
                        self.power_ctrl.Enable(True)

                self.Bind(wx.EVT_RADIOBUTTON, time_enable, self.tsfd_radio)
                self.Bind(wx.EVT_RADIOBUTTON, time_enable, self.sr_radio)
                self.Bind(wx.EVT_RADIOBUTTON, time_enable, self.tfd_radio)
                self.Bind(wx.EVT_RADIOBUTTON, time_enable, self.pfd_radio)

                ctrlsizer.Add(col1, 0, 0, 0)
                ctrlsizer.Add(col2, 0, 0, 0)
                sizer.Add(ctrlsizer, 1, wx.EXPAND | wx.ALL, 10)

                # Ok/cancel controls
                hline = wx.StaticLine(self,
                                      -1,
                                      size=(20, -1),
                                      style=wx.LI_HORIZONTAL)
                sizer.Add(
                    hline, 0,
                    wx.GROW | wx.ALIGN_CENTER_VERTICAL | wx.RIGHT | wx.TOP, 0)

                box = wx.BoxSizer(wx.HORIZONTAL)
                box.Add(wx.Button(self, wx.ID_OK, "Import"), 0,
                        wx.ALIGN_CENTRE | wx.ALL, 5),
                box.Add(wx.Button(self, wx.ID_CANCEL, "Cancel"), 0,
                        wx.ALIGN_CENTRE | wx.ALL, 5),
                sizer.Add(box, 0, 0)

                self.SetSizer(sizer)
                sizer.Fit(self)
                self.SetAutoLayout(True)
                self.SetSize((300, 300))

            def get_args(self):
                args = {}
                args['rpm_col'] = int(self.rpm.GetStringSelection())
                args['afr_col'] = int(self.afr.GetStringSelection())
                args['knock_col'] = int(self.knock.GetStringSelection())
                args['ts_col'] = int(self.ts.GetStringSelection())
                if self.tsfd_radio.GetValue():
                    args['time_col'] = \
                         int(self.time_ctrl1.GetStringSelection())
                elif self.sr_radio.GetValue():
                    args['sample_rate'] = self.time_ctrl2.GetValue()
                elif self.tfd_radio.GetValue():
                    args['torque_col'] = \
                         int(self.torque_ctrl.GetStringSelection())
                elif self.pfd_radio.GetValue():
                    args['power_col'] = \
                         int(self.power_ctrl.GetStringSelection())

                return args

        dlg = wx.FileDialog(self, "Choose a file", os.getcwd(), "",
                            DYNOFILETYPES, wx.OPEN)
        if dlg.ShowModal() == wx.ID_OK:
            path = dlg.GetPath()
            data = dyno.read_csv(path)
            import_dlg = ImportDialog(self, -1, "import:" + path, data)
            if import_dlg.ShowModal() == wx.ID_OK:
                kwargs = import_dlg.get_args()

                r = dyno.DynoRun()
                r.Import(data, **kwargs)
                self.AddRun(r)
예제 #5
0
    def RoadDyno(self, start, stop, activedialog, sources, finished):
        self.run = None
        ######################################################################
        # Wait for the the dyno run threshold to be reached
        while self.port.RPM() < start:
            if finished():
                activedialog.EndModal(0)
                return

            sleep = arch.time_func()
            while arch.time_func() - sleep < GUI_REFRESH_TIME:
                time.sleep(YIELD_SLEEP_TIME)
            e = UpdateDynoEvent(cur_time=0.0,
                                RPM=self.port.RPM(),
                                AFR=self.port.AFR(),
                                SK=self.port.SMARTKnock())
            wx.PostEvent(activedialog, e)
        ######################################################################

        # Start "real" run
        data = []

        log_evt = threading.Event()

        t = threading.Thread(None, self.port.HighSpeedLog, None,
                             (sources, data), {"finished": log_evt.isSet})
        t.start()

        while len(data) < 2:  # wait for first data point
            time.sleep(YIELD_SLEEP_TIME)

        run = dyno.DynoRun()

        def parseline(d):
            d = d[-1]  # last line
            d = string.split(d, ",")
            return d

        line = parseline(data)
        while int(line[1]) < stop and not finished():
            ctime = float(line[0])
            rpm = int(line[1])
            sk = float(line[2])
            afr = float(line[3])
            e = UpdateDynoEvent(cur_time=ctime, RPM=rpm, AFR=afr, SK=sk)
            wx.PostEvent(activedialog, e)
            line = parseline(data)

            #update GUI
            sleep = arch.time_func()
            while arch.time_func() - sleep < GUI_REFRESH_TIME:
                time.sleep(YIELD_SLEEP_TIME)

            # remove labels
            rundata = data[1:]
            # split lines

            for i in range(0, len(rundata)):
                rundata[i] = string.split(rundata[i], ",")
            run.Import(rundata, 1, time_col=0, knock_col=2, afr_col=3)
            activedialog.rtplot.Update(run)

        log_evt.set()

        t.join()

        self.run = run
        activedialog.EndModal(0)