def plot(e=None): import dyno d = dyno.DynoRun() d.Load("dustin.csv") d1 = dyno.DynoRun() d1.Load("dustin.csv") draw([d, d1])
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()
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)
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)
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)