def set_ens(self, ens: Ensemble): """ Get the data out of the ensemble and populate the structure. Lock and unlock when getting the data to ensure when new data is received, it is not being used with old data. :param ens: Latest ensemble. :return: """ # Lock the object self.thread_lock.acquire() if ens.IsEnsembleData: self.x_dt.append(ens.EnsembleData.datetime().isoformat()) else: self.x_dt.append(None) if ens.IsAncillaryData: self.heading.append(ens.AncillaryData.Heading) self.pitch.append(ens.AncillaryData.Pitch) self.roll.append(ens.AncillaryData.Roll) self.temperature.append(ens.AncillaryData.WaterTemp) else: self.heading.append(None) self.pitch.append(None) self.roll.append(None) self.temperature.append(None) if ens.IsEarthVelocity: avg_mag, avg_dir = ens.EarthVelocity.average_mag_dir() self.water_speed.append(avg_mag) self.water_dir.append(avg_dir) else: self.water_speed.append(None) self.water_dir.append(None) if ens.IsNmeaData: self.num_sats.append(ens.NmeaData.GPGGA.num_sats) self.gnss_qual.append(ens.NmeaData.GPGGA.gps_qual) self.gnss_hdop.append(ens.NmeaData.GPGGA.horizontal_dil) self.vtg_speed.append(ens.NmeaData.speed_m_s) else: self.num_sats.append(None) self.gnss_qual.append(None) self.gnss_hdop.append(None) self.vtg_speed.append(None) if ens.IsBottomTrack: # Get the EarthVelocity data bt_e0 = ens.BottomTrack.EarthVelocity[0] bt_e1 = ens.BottomTrack.EarthVelocity[1] bt_e2 = ens.BottomTrack.EarthVelocity[2] # Calculate the Magnitude and direction for the bottom track data bt_mag = EarthVelocity.calculate_magnitude(bt_e0, bt_e1, bt_e2) bt_dir = EarthVelocity.calculate_direction(bt_e0, bt_e1) if not Ensemble.is_bad_velocity(bt_mag): self.boat_speed.append(bt_mag) self.boat_dir.append(bt_dir) else: # Bad Earth Velocity self.boat_speed.append(None) self.boat_dir.append(None) else: # No Bottom Track self.boat_speed.append(None) self.boat_dir.append(None) self.thread_lock.release()
def test_magnitude(): east = 1.33 north = 1.45 vert = 0.3 result = EarthVelocity.calculate_magnitude(east, north, vert) assert 1.99 == pytest.approx(result, 0.01)