class ResetThread(QtCore.QThread): """Thread for resetting Vectrino""" def __init__(self): QtCore.QThread.__init__(self) print("Vectrino reset thread initialized") self.vec = PdControl() self.comport = "COM2" self.isconnected = self.vec.connected self.vecstatus = "Vectrino disconnected " self.enable = True print("Vectrino thread init done") def run(self): self.vec.serial_port = self.comport self.vec.connect() tstart = time.time() self.timeout = False self.vecstatus = "Connecting to Vectrino..." while not self.vec.connected: time.sleep(0.3) if time.time() - tstart > 10: print("Vectrino timed out") self.timeout = True break if not self.timeout: self.vec.stop() self.vecstatus = "Vectrino connected " while self.vec.state != "Confirmation mode": time.sleep(0.3) print("Vectrino in data confirmation mode") self.stop() def stop(self): self.vec.stop_disk_recording() self.vec.stop() while self.vec.state != "Command mode": time.sleep(0.3) self.vec.disconnect() self.vecstatus = "Vectrino disconnected "
class TurbineTow(QtCore.QThread): towfinished = QtCore.pyqtSignal() def __init__(self, acs_hcomm, U, tsr, y_R, z_H, turbine_properties, nidaq=True, vectrino=True, vecsavepath="", fbg=False, fbg_properties={}, settling=False, vec_salinity=0.0): """Turbine tow run object.""" QtCore.QThread.__init__(self) self.hc = acs_hcomm self.U = float(U) self.tsr = tsr self.y_R = y_R self.z_H = z_H self.R = turbine_properties["radius"] self.H = turbine_properties["height"] self.vectrino = vectrino self.nidaq = nidaq self.fbg = fbg self.settling = settling self.build_acsprg() self.acsdaqthread = daqtasks.AcsDaqThread(self.hc) self.maxvel = U * 1.3 self.usetrigger = True self.vecsavepath = vecsavepath self.recordvno = True self.vecstatus = "Vectrino disconnected " self.autoaborted = False self.aborted = False self.vec_salinity = vec_salinity commit = check_output(["git", "rev-parse", "--verify", "HEAD"])[:-1] self.metadata = { "Tow speed (m/s)": float(U), "Tip speed ratio": tsr, "Time created": time.asctime(), "TurbineDAQ version": commit } if self.vectrino: self.vec = PdControl() self.metadata["Vectrino metadata"] = {"y/R": y_R, "z/H": z_H} if self.nidaq: self.daqthread = daqtasks.NiDaqThread(usetrigger=self.usetrigger) self.nidata = self.daqthread.data self.metadata["NI metadata"] = self.daqthread.metadata if self.fbg: self.fbgthread = daqtasks.FbgDaqThread(fbg_properties, usetrigger=self.usetrigger) self.metadata["FBG metadata"] = self.fbgthread.metadata self.fbgdata = self.fbgthread.data def build_acsprg(self): """Create the ACSPL+ program for running the run. This run should send a trigger pulse.""" if self.settling: endpos = 9.0 else: endpos = 0.0 self.acs_prg = acsprgs.turbine_tow_prg(self.U, self.tsr, self.R, endpos=endpos) def setvecconfig(self): self.vec.start_on_sync = self.usetrigger self.vec.sync_master = not self.usetrigger self.vec.sample_on_sync = False self.vec.sample_rate = 200 self.vec.coordinate_system = "XYZ" self.vec.power_level = "High" self.vec.transmit_length = 3 self.vec.sampling_volume = 3 self.vec.sound_speed_mode = "measured" self.vec.salinity = self.vec_salinity if self.maxvel <= 4.0 and self.maxvel > 2.5: self.vec.vel_range = 0 elif self.maxvel <= 2.5 and self.maxvel > 1.0: self.vec.vel_range = 1 elif self.maxvel <= 1.0 and self.maxvel > 0.3: self.vec.vel_range = 2 elif self.maxvel <= 0.3 or self.settling: self.vec.vel_range = 3 self.vec.set_config() self.metadata["Vectrino metadata"]["Velocity range (index)"] = \ self.vec.vel_range self.metadata["Vectrino metadata"]["Sample rate (Hz)"] = \ self.vec.sample_rate self.metadata["Vectrino metadata"]["Coordinate system"] = \ self.vec.coordinate_system self.metadata["Vectrino metadata"]["Salinity (ppt)"] = \ self.vec.salinity self.metadata["Vectrino metadata"]["Transmit length"] = \ self.vec.transmit_length self.metadata["Vectrino metadata"]["Sampling volume"] = \ self.vec.sampling_volume print("Vectrino configuration set") def run(self): """Start the run. Comms should be open already with the controller.""" if acsc.getOutput(self.hc, 1, 16): acsc.setOutput(self.hc, 1, 16, 0) if self.vectrino: acsc.enable(self.hc, 0) acsc.enable(self.hc, 1) while not acsc.getMotorState(self.hc, 0)["enabled"] or not \ acsc.getMotorState(self.hc, 1)["enabled"]: self.msleep(100) acsc.toPoint(self.hc, None, 0, self.y_R * self.R) acsc.toPoint(self.hc, None, 1, self.z_H * self.H) while not acsc.getMotorState(self.hc, 0)["in position"] or not \ acsc.getMotorState(self.hc, 1)["in position"]: self.msleep(300) print("y- and z-axes in position") acsc.disable(self.hc, 0) acsc.disable(self.hc, 1) self.vec.serial_port = "COM2" self.vec.connect() tstart = time.time() self.timeout = False self.vecstatus = "Connecting to Vectrino..." while not self.vec.connected: self.msleep(300) if time.time() - tstart > 10: print("Vectrino timed out") self.timeout = True break if not self.timeout: self.vec.stop() self.setvecconfig() if self.recordvno: self.vec.start_disk_recording(self.vecsavepath) self.vec.start() self.vecstatus = "Vectrino connected " while self.vec.state != "Confirmation mode": self.msleep(100) print("Vectrino in data collection mode") print("Waiting 6 seconds") self.sleep(6) self.daqthread.start() if self.fbg: self.fbgthread.start() self.start_motion() elif self.nidaq: self.daqthread.start() if self.fbg: self.fbgthread.start() self.start_motion() else: # Start motion self.start_motion() def start_motion(self): self.acsdaqthread.start() nbuf = 19 acsc.loadBuffer(self.hc, nbuf, self.acs_prg, 2048) acsc.enable(self.hc, 4) acsc.enable(self.hc, 5) acsc.runBuffer(self.hc, nbuf) prgstate = acsc.getProgramState(self.hc, nbuf) while prgstate == 3: time.sleep(0.3) prgstate = acsc.getProgramState(self.hc, nbuf) self.acsdaqthread.stop() if self.nidaq: self.daqthread.clear() print("NI tasks cleared") if self.fbg: self.fbgthread.stop() if self.vectrino: if self.settling: # Wait 10 minutes to measure tank settling time print("Waiting 10 minutes") t0 = time.time() dt = 0.0 while not self.aborted and dt < 600: time.sleep(0.5) dt = time.time() - t0 if self.recordvno: self.vec.stop_disk_recording() self.vec.stop() self.vec.disconnect() print("Tow finished") if self.vectrino: if self.vec.state == "Not connected": self.vecstatus = "Vectrino disconnected " print("Resetting Vectrino") self.reset_vec() self.towfinished.emit() def reset_vec(self): self.vec.connect() self.vec.stop_disk_recording() self.vec.stop() self.vec.disconnect() self.vec.data = {} print("Vectrino reset") def abort(self): """This should stop everything.""" print("Aborting turbine tow") self.aborted = True acsc.stopBuffer(self.hc, 19) acsc.halt(self.hc, 0) acsc.halt(self.hc, 1) acsc.halt(self.hc, 4) acsc.halt(self.hc, 5) def autoabort(self): """This should stop everything and return carriage and turbine back to zero.""" self.autoaborted = True acsc.stopBuffer(self.hc, 19) acsc.halt(self.hc, 0) acsc.halt(self.hc, 1) acsc.halt(self.hc, 4) acsc.halt(self.hc, 5) acsc.toPoint(self.hc, None, 4, 0.0) acsc.setVelocity(self.hc, 5, 0.5) acsc.toPoint(self.hc, None, 5, 0.0)
import time import matplotlib.pyplot as plt import numpy as np vec = PdControl() vec.serial_port = "COM8" vec.start_on_sync = False vec.sync_master = True vec.sample_rate = 100 vec.vel_range = 2 vec.transmit_length = 3 vec.sampling_volume = 3 vec.salinity = 0.0 vec.power_level = "High" vec.connect() while not vec.connected: print "Connecting..." time.sleep(0.5) print "Connected!" vec.set_config() vec.stop() vec.start_disk_recording("test/test", False) vec.start() while vec.state != "Confirmation mode": time.sleep(0.2) print "Collecting data..."
class TurbineTow(QtCore.QThread): towfinished = QtCore.pyqtSignal() def __init__(self, acs_hcomm, U, tsr, y_R, z_H, turbine_properties, nidaq=True, vectrino=True, vecsavepath="", fbg=False, fbg_properties={}, settling=False, vec_salinity=0.0): """Turbine tow run object.""" QtCore.QThread.__init__(self) self.hc = acs_hcomm self.U = float(U) self.tsr = tsr self.y_R = y_R self.z_H = z_H self.R = turbine_properties["radius"] self.H = turbine_properties["height"] self.vectrino = vectrino self.nidaq = nidaq self.fbg = fbg self.settling = settling self.build_acsprg() self.acsdaqthread = daqtasks.AcsDaqThread(self.hc) self.maxvel = U*1.3 self.usetrigger = True self.vecsavepath = vecsavepath self.recordvno = True self.vecstatus = "Vectrino disconnected " self.autoaborted = False self.aborted = False self.vec_salinity = vec_salinity commit = check_output(["git", "rev-parse", "--verify", "HEAD"])[:-1] self.metadata = {"Tow speed (m/s)" : float(U), "Tip speed ratio" : tsr, "Time created" : time.asctime(), "TurbineDAQ version" : commit} if self.vectrino: self.vec = PdControl() self.metadata["Vectrino metadata"] = {"y/R": y_R, "z/H": z_H} if self.nidaq: self.daqthread = daqtasks.NiDaqThread(usetrigger=self.usetrigger) self.nidata = self.daqthread.data self.metadata["NI metadata"] = self.daqthread.metadata if self.fbg: self.fbgthread = daqtasks.FbgDaqThread(fbg_properties, usetrigger=self.usetrigger) self.metadata["FBG metadata"] = self.fbgthread.metadata self.fbgdata = self.fbgthread.data def build_acsprg(self): """Create the ACSPL+ program for running the run. This run should send a trigger pulse.""" if self.settling: endpos = 9.0 else: endpos = 0.0 self.acs_prg = acsprgs.turbine_tow_prg(self.U, self.tsr, self.R, endpos=endpos) def setvecconfig(self): self.vec.start_on_sync = self.usetrigger self.vec.sync_master = not self.usetrigger self.vec.sample_on_sync = False self.vec.sample_rate = 200 self.vec.coordinate_system = "XYZ" self.vec.power_level = "High" self.vec.transmit_length = 3 self.vec.sampling_volume = 3 self.vec.sound_speed_mode = "measured" self.vec.salinity = self.vec_salinity if self.maxvel <= 4.0 and self.maxvel > 2.5: self.vec.vel_range = 0 elif self.maxvel <= 2.5 and self.maxvel > 1.0: self.vec.vel_range = 1 elif self.maxvel <= 1.0 and self.maxvel > 0.3: self.vec.vel_range = 2 elif self.maxvel <= 0.3 or self.settling: self.vec.vel_range = 3 self.vec.set_config() self.metadata["Vectrino metadata"]["Velocity range (index)"] = \ self.vec.vel_range self.metadata["Vectrino metadata"]["Sample rate (Hz)"] = \ self.vec.sample_rate self.metadata["Vectrino metadata"]["Coordinate system"] = \ self.vec.coordinate_system self.metadata["Vectrino metadata"]["Salinity (ppt)"] = \ self.vec.salinity self.metadata["Vectrino metadata"]["Transmit length"] = \ self.vec.transmit_length self.metadata["Vectrino metadata"]["Sampling volume"] = \ self.vec.sampling_volume print("Vectrino configuration set") def run(self): """Start the run. Comms should be open already with the controller.""" if acsc.getOutput(self.hc, 1, 16): acsc.setOutput(self.hc, 1, 16, 0) if self.vectrino: acsc.enable(self.hc, 0) acsc.enable(self.hc, 1) while not acsc.getMotorState(self.hc, 0)["enabled"] or not \ acsc.getMotorState(self.hc, 1)["enabled"]: self.msleep(100) acsc.toPoint(self.hc, None, 0, self.y_R*self.R) acsc.toPoint(self.hc, None, 1, self.z_H*self.H) while not acsc.getMotorState(self.hc, 0)["in position"] or not \ acsc.getMotorState(self.hc, 1)["in position"]: self.msleep(300) print("y- and z-axes in position") acsc.disable(self.hc, 0) acsc.disable(self.hc, 1) self.vec.serial_port = "COM2" self.vec.connect() tstart = time.time() self.timeout = False self.vecstatus = "Connecting to Vectrino..." while not self.vec.connected: self.msleep(300) if time.time() - tstart > 10: print("Vectrino timed out") self.timeout = True break if not self.timeout: self.vec.stop() self.setvecconfig() if self.recordvno: self.vec.start_disk_recording(self.vecsavepath) self.vec.start() self.vecstatus = "Vectrino connected " while self.vec.state != "Confirmation mode": self.msleep(100) print("Vectrino in data collection mode") print("Waiting 6 seconds") self.sleep(6) self.daqthread.start() if self.fbg: self.fbgthread.start() self.start_motion() elif self.nidaq: self.daqthread.start() if self.fbg: self.fbgthread.start() self.start_motion() else: # Start motion self.start_motion() def start_motion(self): self.acsdaqthread.start() nbuf = 19 acsc.loadBuffer(self.hc, nbuf, self.acs_prg, 2048) acsc.enable(self.hc, 4) acsc.enable(self.hc, 5) acsc.runBuffer(self.hc, nbuf) prgstate = acsc.getProgramState(self.hc, nbuf) while prgstate == 3: time.sleep(0.3) prgstate = acsc.getProgramState(self.hc, nbuf) self.acsdaqthread.stop() if self.nidaq: self.daqthread.clear() print("NI tasks cleared") if self.fbg: self.fbgthread.stop() if self.vectrino: if self.settling: # Wait 10 minutes to measure tank settling time print("Waiting 10 minutes") t0 = time.time() dt = 0.0 while not self.aborted and dt < 600: time.sleep(0.5) dt = time.time() - t0 if self.recordvno: self.vec.stop_disk_recording() self.vec.stop() self.vec.disconnect() print("Tow finished") if self.vectrino: if self.vec.state == "Not connected": self.vecstatus = "Vectrino disconnected " print("Resetting Vectrino") self.reset_vec() self.towfinished.emit() def reset_vec(self): self.vec.connect() self.vec.stop_disk_recording() self.vec.stop() self.vec.disconnect() self.vec.data = {} print("Vectrino reset") def abort(self): """This should stop everything.""" print("Aborting turbine tow") self.aborted = True acsc.stopBuffer(self.hc, 19) acsc.halt(self.hc, 0) acsc.halt(self.hc, 1) acsc.halt(self.hc, 4) acsc.halt(self.hc, 5) def autoabort(self): """This should stop everything and return carriage and turbine back to zero.""" self.autoaborted = True acsc.stopBuffer(self.hc, 19) acsc.halt(self.hc, 0) acsc.halt(self.hc, 1) acsc.halt(self.hc, 4) acsc.halt(self.hc, 5) acsc.toPoint(self.hc, None, 4, 0.0) acsc.setVelocity(self.hc, 5, 0.5) acsc.toPoint(self.hc, None, 5, 0.0)
class VectrinoThread(QtCore.QThread): """Thread for running Vectrino""" collecting = QtCore.pyqtSignal() connectsignal = QtCore.pyqtSignal(bool) def __init__(self, maxvel=2.5, usetrigger=True, record=False, salinity=0.0): QtCore.QThread.__init__(self) print("Vectrino thread initialized") self.vec = PdControl() self.vecdata = self.vec.data self.usetrigger = usetrigger self.maxvel = maxvel self.comport = "COM2" self.record = record self.isconnected = self.vec.connected self.savepath = "" self.vecstatus = "Vectrino disconnected " self.enable = True self.salinity = salinity print("Vectrino thread init done") def setconfig(self): self.vec.start_on_sync = self.usetrigger self.vec.sync_master = not self.usetrigger self.vec.sample_on_sync = False self.vec.sample_rate = 200 self.vec.transmit_length = 3 self.vec.sampling_volume = 3 self.vec.sound_speed_mode = "measured" self.vec.salinity = self.salinity self.vec.power_level = "High" if self.maxvel <= 4.0 and self.maxvel > 2.5: self.vec.vel_range = 0 elif self.maxvel <= 2.5 and self.maxvel > 1.0: self.vec.vel_range = 1 elif self.maxvel <= 1.0 and self.maxvel > 0.3: self.vec.vel_range = 2 self.vec.set_config() print("Vectrino configuration set") def run(self): self.vec.serial_port = self.comport self.vec.connect() tstart = time.time() self.timeout = False self.vecstatus = "Connecting to Vectrino..." while not self.vec.connected: time.sleep(0.5) if time.time() - tstart > 10: print("Vectrino timed out") self.timeout = True self.connectsignal.emit(False) break if not self.timeout: self.connectsignal.emit(True) self.vec.stop() self.setconfig() if self.record: self.vec.start_disk_recording(self.savepath) self.vec.start() self.vecstatus = "Vectrino connected " while self.vec.state != "Confirmation mode": time.sleep(0.1) print("Vectrino in data collection mode") time.sleep(6) self.collecting.emit() print("Vectrino collecting") def getstatus(self): return self.vec.state def stop(self): self.enable = False if self.record: self.vec.stop_disk_recording() self.vec.stop() self.vec.disconnect() self.vecstatus = "Vectrino disconnected "