def read_current_data(self, message: str) -> Measure: time = datetime.datetime.now() if(message == 'speed'): return Measure(self.MOCK_SPEED, 'km/h', time) elif(message == 'rpm'): return Measure(self.MOCK_RPM, 'rpm', time) else: print("MockOBDDevice read_current_data not implemented for message: {}".format(message))
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
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
def read_temperature(self) -> Measure: """This mock thermometer returns an increasing temperature""" assert self._ready time = datetime.datetime.now() temperature = Measure(self._value, self.MOCK_UNITS, time) self._value = self._value + self.INCREMENT_VALUE return temperature
def read_voltage(self) -> Measure: """This mock voltmeter returns an increasing voltage""" assert self._ready time = datetime.datetime.now() voltage = Measure(self._value, self.MOCK_UNITS, time) self._value = self._value + self.INCREMENT_VALUE return voltage
def read_pressure(self) -> Measure: """This mock barometer returns an increasing pressure""" assert self._ready time = datetime.datetime.now() pressure = Measure(self._value, self.MOCK_UNITS, time) self._value = self._value + self.INCREMENT_VALUE return pressure
def test_distance(): value = 5 units = "metres" time = datetime.datetime.now() distance = Measure(value, units, time) assert distance.value == value assert distance.units == units assert distance.time == time
def mean_measure(measures) -> Measure: """Given a non-empty list of Measures and given that the caller holds the lock, Return a Measure with the mean value and the units & time from the 0th entry""" sum_value = 0 for measure in measures: sum_value += measure.value average_value = sum_value / len(measures) return Measure(average_value, measures[0].units, measures[0].time)
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
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
def get_measures(self): from measure.measure import Measure result = [] for xml_measure in self.measure[:]: attributes = xml_measure.attributes[:] measure = Measure(attributes=attributes, elements=[]) for elt in xml_measure.content(): measure.elements.append(elt) result.append(measure) return result
def read_acceleration(self) -> Measure: assert self._ready time = datetime.datetime.now() accel = mpu6050.get_accel_data(self.init) x = accel['x'] - self.accel['x'] y = accel['y'] - self.accel['y'] z = accel['z'] - self.accel['z'] self.accel_mag = self.calculate_magnitude(x, y, z) magnitude_measure = Measure(self.accel_mag, self.units, time) return magnitude_measure
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
def parse_obd_info(self, message, response): """Parses byte array from bus stream into readable info according to lookup table""" if(message == 'pidsupport'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" elif(message == 'monitor_status'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" elif (message == 'freeze_dtc'): print("Froze DTC") return elif (message == 'fuel_system_status'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" elif (message == 'engine_load'): """returns %, A*100/255""" time = datetime.datetime.now() result = Measure((int(response[3]) * 100) / 255, "%", time) return result elif (message == 'coolant_temp'): """returns Celcius, A-40""" time = datetime.datetime.now() result = Measure(int(response[3]) - 40, "Celcius", time) return result elif (message == 'sterm_fuel1'): """returns %, (A-128) * 100/128""" time = datetime.datetime.now() result = Measure((int(response[3]) - 128) * (100 / 128), "%", time) return result elif (message == 'lterm_fuel1'): """returns %, (A-128) * 100/128""" time = datetime.datetime.now() result = Measure((int(response[3]) - 128) * (100 / 128), "%", time) return result elif (message == 'sterm_fuel2'): """returns %, (A-128) * 100/128""" time = datetime.datetime.now() result = Measure((int(response[3]) - 128) * (100 / 128), "%", time) return result elif (message == 'lterm_fuel2'): """returns %, (A-128) * 100/128""" time = datetime.datetime.now() result = Measure((int(response[3]) - 128) * (100 / 128), "%", time) return result elif (message == 'fuel_pressure'): """returns kPa, A""" time = datetime.datetime.now() result = Measure(int(response[3]), "kPa", time) return result elif (message == 'intake_manifold_pressure'): """returns kPa, A*3""" time = datetime.datetime.now() result = Measure(int(response[3]) * 3, "kPa", time) return result elif (message == 'rpm'): """returns rpm, ((A*256)+B)/4""" time = datetime.datetime.now() result = Measure((int(response[3]) * 256 + int(response[4])) / 4, "rpm", time) return result elif (message == 'speed'): """returns km/h, A""" time = datetime.datetime.now() result = Measure(int(response[3]), "km/h", time) return result elif (message == 'timing_advance'): """returns degress relative to cylinder 1, A/2 - 64""" time = datetime.datetime.now() result = Measure(int(response[3]) / 2 - 64, "degree", time) return result elif (message == 'intake_air_temp'): """returns Celcius, A-40""" time = datetime.datetime.now() result = Measure(int(response[3]) - 40, "Celcius", time) return result elif (message == 'MAF_flow'): """returns g/s, ((256*A)+B) / 100""" time = datetime.datetime.now() result = Measure( ((256 * int(response[3])) + int(response[4])) / 100, "g/s", time) return result elif (message == 'throttle_position'): """returns %, A*100/255""" time = datetime.datetime.now() result = Measure(int(response[3]) * 100 / 255, "%", time) return result elif (message == 'secondary_air_status'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'oxygen_present'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'oxy_b1_s1'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'oxy_b1_s2'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'oxy_b1_s3'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'oxy_b1_s4'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'oxy_b2_s1'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'oxy_b2_s3'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'oxy_b2_s3'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'oxy_b2_s4'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'obd_standard_id'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'oxygen_sensor_present'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'aux_input_status'): """returns T/F, A&4""" time = datetime.datetime.now() result = Measure(int(response[3]) & 4, "T/F", time) return result elif (message == 'engine_run_time'): """returns seconds, (A*256)+B""" time = datetime.datetime.now() result = Measure((int(response[3]) * 256) + int(response[4]), "seconds", time) return result elif (message == 'pids_support_21_40'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'distance_traveled_MIL'): """returns seconds, (A*256)+B""" time = datetime.datetime.now() result = Measure((int(response[3]) * 256) + int(response[4]), "seconds", time) return result elif (message == 'fuel_rail_pressure'): """returns kPA, ((A*256)+B)*0.079""" time = datetime.datetime.now() result = Measure( ((int(response[3]) * 256) + int(response[4])) * 0.079, "kPa", time) return result elif (message == 'fuel_rail_pressure_diesel'): """returns kPa, ((A*256)+B)*10""" time = datetime.datetime.now() result = Measure( ((int(response[3]) * 256) + int(response[4])) * 10, "kPa", time) return result elif (message == 'VO2S1_WR_lambda'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'VO2S2_WR_lambda'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'VO2S3_WR_lambda'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'VO2S4_WR_lambda'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'VO2S5_WR_lambda'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'VO2S6_WR_lambda'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'VO2S7_WR_lambda'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'VO2S8_WR_lambda'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'ERG'): """returns %, 100*A/255""" time = datetime.datetime.now() result = Measure(100 * int(response[3]) / 255, "%", time) return result elif (message == 'ERG_error'): """returns %, A*0.78125 - 100""" time = datetime.datetime.now() result = Measure(int(response[3]) * 0.78125 - 100, "%", time) return result elif (message == 'evaporative_purge'): """returns %, 100*A/255""" time = datetime.datetime.now() result = Measure(100 * int(response[3]) / 255, "%", time) return result elif (message == 'fuel_level'): """returns %, 100*A/255""" time = datetime.datetime.now() result = Measure(100 * int(response[3]) / 255, "%", time) return result elif (message == 'warm_up_attemps_since_clear'): """returns N/A, A""" time = datetime.datetime.now() result = Measure(int(response[3]), "N/A", time) return result elif (message == 'distance_traveled_since_clear'): """returns km, (A*256)+B""" time = datetime.datetime.now() result = Measure((int(response[3]) * 256) + int(response[4]), "km", time) return result elif (message == 'evap_vapour_pressure'): """returns kPa, (A*256)+B)/4 - 8,192""" time = datetime.datetime.now() result = Measure( ((int(response[3]) * 256) + int(response[3], 16)) / 4 - 8192, "kPa", time) return result elif (message == 'baromatic_pressure'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'CO2S1_WR_lambda'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'CO2S2_WR_lambda'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'CO2S3_WR_lambda'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'CO2S4_WR_lambda'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'CO2S5_WR_lambda'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'CO2S6_WR_lambda'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'CO2S7_WR_lambda'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'CO2S8_WR_lambda'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'catalyst_temp_B1S1'): """returns Celcius, ((A*256)+B)/10 - 40""" time = datetime.datetime.now() result = Measure( ((int(response[3]) * 256) + int(response[4])) / 10 - 40, "Celcius", time) return result elif (message == 'catalyst_temp_B2S1'): """returns Celsius, ((A*256)+B)/10 - 40""" time = datetime.datetime.now() result = Measure( ((int(response[3]) * 256) + int(response[4])) / 10 - 40, "Celcius", time) return result elif (message == 'catalyst_temp_B1S2'): """returns Celsius, ((A*256)+B)/10 - 40""" time = datetime.datetime.now() result = Measure( ((int(response[3]) * 256) + int(response[4])) / 10 - 40, "Celcius", time) return result elif (message == 'catalyst_temp_B2S2'): """returns Celsius, ((A*256)+B)/10 - 40""" time = datetime.datetime.now() result = Measure( ((int(response[3]) * 256) + int(response[4])) / 10 - 40, "Celcius", time) return result elif (message == 'pids_support_41_60'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'monitor_status_drive_cycle'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'control_module_voltage'): """returns Voltage, ((A*256)+B)/1000""" time = datetime.datetime.now() result = Measure( ((int(response[3]) * 256) + int(response[4])) / 1000, "Voltage", time) return result elif (message == 'absolute_load'): """returns %, ((A*256)+B)*100/255""" time = datetime.datetime.now() result = Measure( ((int(response[3]) * 256) + int(response[4])) * 100 / 255, "%", time) return result elif (message == 'command_equivalence_ratio'): """returns N/A, ((A*256)+B)*0.0000305""" time = datetime.datetime.now() result = Measure( (((int(response[3]) * 256) + int(response[4])) * 0.0000305) * 100 / 255, "N/A", time) return result elif (message == 'relative_throttle_position'): """returns %, A*100/255""" time = datetime.datetime.now() result = Measure(int(response[3]) * 100 / 255, "%", time) return result elif (message == 'ambient_air_temp'): """returns Celcius, A-40""" time = datetime.datetime.now() result = Measure(int(response[3]) - 40, "Celcius", time) return result elif (message == 'absolute_throttle_position_B'): """returns %, A*100/255""" time = datetime.datetime.now() result = Measure(int(response[3]) * 100 / 255, "%", time) return result elif (message == 'absolute_throttle_position_C'): """returns %, A*100/255""" time = datetime.datetime.now() result = Measure(int(response[3]) * 100 / 255, "%", time) return result elif (message == 'absolute_throttle_position_D'): """returns %, A*100/255""" time = datetime.datetime.now() result = Measure(int(response[3]) * 100 / 255, "%", time) return result elif (message == 'absolute_throttle_position_E'): """returns %, A*100/255""" time = datetime.datetime.now() result = Measure(int(response[3]) * 100 / 255, "%", time) return result elif (message == 'absolute_throttle_position_F'): """returns %, A*100/255""" time = datetime.datetime.now() result = Measure(int(response[3]) * 100 / 255, "%", time) return result elif (message == 'command_throttle_actuator'): """returns %, A*100/255""" time = datetime.datetime.now() result = Measure(int(response[3]) * 100 / 255, "%", time) return result elif (message == 'time_run_with_MIL'): """returns minutes, (A*256)+B""" time = datetime.datetime.now() result = Measure(((int(response[3]) * 256) + int(response[4])), "Minutes", time) return result elif (message == 'time_since_MIL_clear'): """returns minutes, (A*256)+B""" time = datetime.datetime.now() result = Measure(((int(response[3]) * 256) + int(response[4])), "Minutes", time) return result elif (message == 'fuel_type'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" return int(response[3]) elif (message == 'ethanol_fuel_percent'): """returns %, A*100/255""" time = datetime.datetime.now() result = Measure(int(response[3]) * 100 / 255, "%", time) return result elif (message == 'VIN'): """TODO: http://www.geekmyride.org/wiki/index.php/OBD-II_PIDs#Bitwise_encoded_PIDs""" A = response[3] B = response[4] C = response[5] D = response[6] E = response[7] return int(response[3]) return result
def __init__(self, latitude: numbers.Number, longitude: numbers.Number, altitude: numbers.Number, time: numbers.Number): self._latitude = Measure(latitude, 'degrees', time) self._longitude = Measure(longitude, 'degrees', time) self._altitude = Measure(altitude, 'metres', time)
def read_temperature(self) -> Measure: """This mock thermometer always returns 22 celsius""" assert self._ready time = datetime.datetime.now() temperature = Measure(self.MOCK_VALUE, self.MOCK_UNITS, time) return temperature
def read_acceleration(self) -> Measure: """This mock accelerometer """ assert self._ready time = datetime.datetime.now() magnitude_measure = Measure(self.MOCK_VALUE, self.MOCK_UNITS, time) return magnitude_measure
def read_temperature(self) -> Measure: assert self._ready time = datetime.datetime.now() self.temperature = mpu6050.get_temp(self.init) temp = Measure(self.temperature, self.units, time) return temp