Esempio n. 1
0
def test_minimum_maximum():
    """Test the minimum and maximum methods"""
    time0 = datetime.datetime.now()
    units = "metres"
    distance0 = Measure(5, units, time0)
    distance1 = Measure(6, units, time0)
    distance2 = Measure(4, units, time0)
    name = "distance"
    capacity = 5
    accumulator = Accumulator(name, capacity)
    assert accumulator.minimum() == None
    assert accumulator.maximum() == None
    accumulator.push(distance0)
    accumulator.push(distance1)
    accumulator.push(distance2)
    assert accumulator.minimum().value == distance2.value
    assert accumulator.maximum().value == distance1.value
Esempio n. 2
0
def test_median():
    time = datetime.datetime.now()
    units = "metres"
    distance0 = Measure(5, units, time)
    distance1 = Measure(6, units, time)
    distance2 = Measure(12, units, time)
    distance3 = Measure(20, units, time)
    name = "distance"
    capacity = 5
    accumulator = Accumulator(name, capacity)
    assert accumulator.median() == None
    accumulator.push(distance0)
    accumulator.push(distance1)
    accumulator.push(distance2)
    accumulator.push(distance3)
    # use the upper middle measure if there are an even number
    assert accumulator.median().value == 12
Esempio n. 3
0
def test_newest():
    time0 = datetime.datetime.now()
    units = "metres"
    distance0 = Measure(5, units, time0)
    distance1 = Measure(6, units, time0)
    name = "distance"
    capacity = 5
    accumulator = Accumulator(name, capacity)
    assert accumulator.newest() == None
    accumulator.push(distance0)
    accumulator.push(distance1)
    assert accumulator.newest().value == distance1.value
Esempio n. 4
0
def test_empty_clear():
    """Test the empty property and clear method"""
    name = "test"
    capacity = 2
    accumulator = Accumulator(name, capacity)
    assert accumulator.empty
    value = 1
    units = "metres"
    time = datetime.datetime.now()
    measure = Measure(value, units, time)
    accumulator.push(measure)
    assert not accumulator.empty
    accumulator.clear()
    assert accumulator.empty
Esempio n. 5
0
	def __init__(self, config: IConfiguration, deviceCollection: IDeviceCollection):
		assert isinstance(config, IConfiguration)
		self._config = config
		assert isinstance(deviceCollection, IDeviceCollection)
		self._deviceCollection = deviceCollection
		self._deviceCollection.init_devices()

		self.GPS_INTERVAL = self._config.gps_interval
		self.THERMO_INTERVAL = self._config.thermo_interval
		self.ACCEL_INTERVAL = self._config.accel_interval
		self.VOLT_INTERVAL = self._config.volt_interval
		self.BARO_INTERVAL = self._config.baro_interval
		self.RPM_INTERVAL = self._config.rpm_interval
		self.SPEED_INTERVAL = self._config.speed_interval
		self.PRINT_INTERVAL = self._config.manager_print_interval
		self.MOVING_AVERAGE_ITEMS = self._config.manager_moving_average_items

		self._longtitudes = Accumulator("Longitude", self.MOVING_AVERAGE_ITEMS)
		self._latitudes = Accumulator("Latitude", self.MOVING_AVERAGE_ITEMS)
		self._altitudes = Accumulator("Altitude", self.MOVING_AVERAGE_ITEMS)
		self._temperatures = Accumulator("Temperature", self.MOVING_AVERAGE_ITEMS)
		self._accelerations = Accumulator("Acceleration", self.MOVING_AVERAGE_ITEMS)
		self._voltages = Accumulator("Voltage", self.MOVING_AVERAGE_ITEMS)
		self._pressures = Accumulator("Pressure", self.MOVING_AVERAGE_ITEMS)
		self._rpms = Accumulator("RPM", self.MOVING_AVERAGE_ITEMS)
		self._speeds = Accumulator("Speed", self.MOVING_AVERAGE_ITEMS)

		self.NAME_WIDTH = 14
		self.VALUE_WIDTH = 7
		self.UNITS_WIDTH = 8

		self.DEFAULT_ROUNDING_DIGITS = 2
		self.LATITUDE_ROUNDING_DIGITS = 4

		self._workerList = list()
		self.create_workers()
		self.start_workers()
Esempio n. 6
0
class Manager():	
	"""Automates reading from devices"""
	
	def __init__(self, config: IConfiguration, deviceCollection: IDeviceCollection):
		assert isinstance(config, IConfiguration)
		self._config = config
		assert isinstance(deviceCollection, IDeviceCollection)
		self._deviceCollection = deviceCollection
		self._deviceCollection.init_devices()

		self.GPS_INTERVAL = self._config.gps_interval
		self.THERMO_INTERVAL = self._config.thermo_interval
		self.ACCEL_INTERVAL = self._config.accel_interval
		self.VOLT_INTERVAL = self._config.volt_interval
		self.BARO_INTERVAL = self._config.baro_interval
		self.RPM_INTERVAL = self._config.rpm_interval
		self.SPEED_INTERVAL = self._config.speed_interval
		self.PRINT_INTERVAL = self._config.manager_print_interval
		self.MOVING_AVERAGE_ITEMS = self._config.manager_moving_average_items

		self._longtitudes = Accumulator("Longitude", self.MOVING_AVERAGE_ITEMS)
		self._latitudes = Accumulator("Latitude", self.MOVING_AVERAGE_ITEMS)
		self._altitudes = Accumulator("Altitude", self.MOVING_AVERAGE_ITEMS)
		self._temperatures = Accumulator("Temperature", self.MOVING_AVERAGE_ITEMS)
		self._accelerations = Accumulator("Acceleration", self.MOVING_AVERAGE_ITEMS)
		self._voltages = Accumulator("Voltage", self.MOVING_AVERAGE_ITEMS)
		self._pressures = Accumulator("Pressure", self.MOVING_AVERAGE_ITEMS)
		self._rpms = Accumulator("RPM", self.MOVING_AVERAGE_ITEMS)
		self._speeds = Accumulator("Speed", self.MOVING_AVERAGE_ITEMS)

		self.NAME_WIDTH = 14
		self.VALUE_WIDTH = 7
		self.UNITS_WIDTH = 8

		self.DEFAULT_ROUNDING_DIGITS = 2
		self.LATITUDE_ROUNDING_DIGITS = 4

		self._workerList = list()
		self.create_workers()
		self.start_workers()

	def print_all_accumulator_means(self):
		while(True):
			os.system('clear')
			print("MEASURE      | VALUE | UNITS | TIME")
			self.print_accumulator_mean(self._longtitudes)
			self.print_accumulator_mean(self._latitudes, self.LATITUDE_ROUNDING_DIGITS)
			self.print_accumulator_mean(self._altitudes)
			self.print_accumulator_mean(self._temperatures)
			self.print_accumulator_mean(self._accelerations)
			self.print_accumulator_mean(self._voltages)
			self.print_accumulator_mean(self._pressures)
			self.print_accumulator_mean(self._rpms)
			self.print_accumulator_mean(self._speeds)
			time.sleep(self.PRINT_INTERVAL)

	def print_accumulator_mean(self, accumulator, roundDigits = None):
		if (roundDigits == None):
			roundDigits = self.DEFAULT_ROUNDING_DIGITS
		mean = accumulator.mean()
		if (mean != None):
			nameString = accumulator.name.ljust(self.NAME_WIDTH)
			valueString = str(round(mean.value, roundDigits)).rjust(self.VALUE_WIDTH)
			unitsString = mean.units.rjust(self.UNITS_WIDTH)
			timeString = " " + str(mean.time.time())
			string = nameString + valueString + unitsString + timeString
			print(string)

	def create_workers(self):
		self.create_gps_worker_thread()
		self.create_worker_thread(self._temperatures, DeviceConstants.DEVICE_THERMO, self.THERMO_INTERVAL)
		self.create_worker_thread(self._accelerations, DeviceConstants.DEVICE_ACCEL, self.ACCEL_INTERVAL)
		self.create_worker_thread(self._voltages, DeviceConstants.DEVICE_VOLT, self.VOLT_INTERVAL)
		self.create_worker_thread(self._pressures, DeviceConstants.DEVICE_BARO, self.BARO_INTERVAL)
		self.create_worker_thread(self._rpms, MeasureConstants.RPM, self.RPM_INTERVAL)
		self.create_worker_thread(self._speeds, MeasureConstants.SPEED, self.SPEED_INTERVAL)

	def create_worker_thread(self, accumulator, measureString, interval):
		thread = threading.Thread(name = measureString, target=self.measure_worker,
			args=(accumulator, measureString, interval), daemon=True)
		self._workerList.append(thread)

	def measure_worker(self, accumulator, measureString, interval):
		while(True):
			self.read_measure(accumulator, measureString)
			time.sleep(interval)

	def read_measure(self, accumulator, measureString):
		accumulator.push(self._deviceCollection.read_current_data(measureString))

	def create_gps_worker_thread(self):
		# gps is a special case because location consists of three measures
		gps_thread = threading.Thread(name = DeviceConstants.DEVICE_GPS, target=self.location_worker, daemon=True)
		self._workerList.append(gps_thread)

	def location_worker(self):
		while(True):
			self.read_location()
			time.sleep(self.GPS_INTERVAL)

	def read_location(self):
		location = self._deviceCollection.read_current_data(DeviceConstants.DEVICE_GPS)
		self._latitudes.push(location.latitude)
		self._longtitudes.push(location.longitude)
		self._altitudes.push(location.altitude)

	def start_workers(self):
		for each in self._workerList:
			each.start()
Esempio n. 7
0
def test_name():
    name = "test"
    capacity = 2
    accumulator = Accumulator(name, capacity)
    assert accumulator.name == name
Esempio n. 8
0
def test_mean():
    """Test the mean() method and test that the correct capacity is used"""
    time = datetime.datetime.now()
    units = "metres"
    distance0 = Measure(5, units, time)
    distance1 = Measure(6, units, time)
    distance2 = Measure(12, units, time)
    distance3 = Measure(20, units, time)
    average_value = (5 + 6 + 12 + 20) / 4
    name = "distance"
    capacity = 5
    accumulator = Accumulator(name, capacity)
    assert accumulator.mean() == None
    accumulator.push(distance0)
    accumulator.push(distance1)
    accumulator.push(distance2)
    accumulator.push(distance3)
    assert accumulator.mean().value == average_value
    # push more entries to check that the previous entries are dropped
    # once we go over the accumulator's capacity
    distance4 = Measure(1, units, time)
    distance5 = Measure(1, units, time)
    distance6 = Measure(1, units, time)
    distance7 = Measure(1, units, time)
    distance8 = Measure(1, units, time)
    accumulator.push(distance4)
    accumulator.push(distance5)
    accumulator.push(distance6)
    accumulator.push(distance7)
    accumulator.push(distance8)
    assert accumulator.mean().value == 1