def setUp(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('GPS_Time', '21:23:48.021') self.test_state.set_data_item('GPS_Date', '15-05-19') self.test_state.set_data_item('Latitude', 39.739242) self.test_state.set_data_item('Longitude', 104.9903299) self.test_state.set_data_item('Altitude', 1609) self.test_state.set_data_item('X', 0.15) self.test_state.set_data_item('Y', 0.86) self.test_state.set_data_item('Z', 1.18) self.test_state.set_data_item('KPH', 86.3) self.test_state.set_data_item('Lap', 3) self.test_state.set_data_item('RPM', 5891) self.test_state.set_data_item('Gear', 3) self.test_state.set_data_item('Throttle', 97) self.test_state.set_data_item('ECU_Throttle', 95) self.test_state.set_data_item('Brake', 1) self.test_state.set_data_item('Brake_Pressure', 42) self.test_state.set_data_item('Clutch', 0) self.test_state.set_data_item('Steering_Angle', 6.21) self.test_state.set_data_item('Steering_Rate', 0.42) self.test_state.set_data_item('Coolant_Temperature', 99) self.test_state.set_data_item('Oil_Pressure', 240) self.test_state.set_data_item('Oil_Temperature', 96) self.test_state.set_data_item('LF_KPH', 85.2) self.test_state.set_data_item('RF_KPH', 86.9) self.test_state.set_data_item('LR_KPH', 85.0) self.test_state.set_data_item('RR_KPH', 86.7) self.test_state.set_data_item('PSM', 0) self.test_state.set_data_item('GPS_KPH', 0.86) self.test_state.set_data_item('GPS_Heading', 321.41) self.test_state.set_data_item('Accuracy', 0.10) self.test_formatter = CsvFormatter(dict()) pass
def testFrame24A(self): test_fields = [ "$CNDRV", "476.72", "24A", "0B", "10", "C8", "10", "0E", "10", "D2", "10" ] test_extractor = CanFrame24AExtractor() test_extractor.extractData(test_fields, CanFrameParserTest.test_state) self.assertAlmostEqual( 41.07, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.LF_KPH)), 2, 'LF wheel speed was not parsed correctly.') self.assertAlmostEqual( 42.96, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.RF_KPH)), 2, 'RF wheel speed was not parsed correctly.') self.assertAlmostEqual( 41.10, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.LR_KPH)), 2, 'LR wheel speed was not parsed correctly.') self.assertAlmostEqual( 41.12, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.RR_KPH)), 2, 'RR wheel speed was not parsed correctly.') pass
def testParserFrame24A(self): test_line = "$CNDRV,480.17,24A,0B,20,C8,20,F7,20,02,21" CanFrameParserTest.test_parser.parse(test_line) self.assertEqual( 480.17, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Time)), 'Time was not parsed correctly.') self.assertAlmostEqual( 82.030, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.LF_KPH)), 3, 'LF wheel speed was not parsed correctly.') self.assertAlmostEqual( 83.920, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.RF_KPH)), 3, 'RF wheel speed was not parsed correctly.') self.assertAlmostEqual( 84.390, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.LR_KPH)), 3, 'LR wheel speed was not parsed correctly.') self.assertAlmostEqual( 84.810, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.RR_KPH)), 3, 'RR wheel speed was not parsed correctly.') pass
def testParse(self): test_line = "$AC001,477.72,524,598,626" self.test_parser.parse(test_line) self.assertEqual(477.72, self.test_state.get_data_item(DataState.get_data_name_at_idx(DataState.names.Time)), 'Time was not parsed correctly.') self.assertAlmostEqual(0.23, self.test_state.get_data_item(DataState.get_data_name_at_idx(DataState.names.X)), 2, 'X acceleration was not parsed correctly.') self.assertAlmostEqual(0.84, self.test_state.get_data_item(DataState.get_data_name_at_idx(DataState.names.Y)), 2, 'Y acceleration was not parsed correctly.') self.assertAlmostEqual(1.03, self.test_state.get_data_item(DataState.get_data_name_at_idx(DataState.names.Z)), 2, 'Z acceleration was not parsed correctly.') pass
def testClutch(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('DateTime', datetime(2019,5,15,21,23,48,21000,timezone.utc)) self.test_state.set_data_item('Clutch', 0) self.test_state.set_data_item('Lap', 3) actual = self.test_formatter.formatData(self.test_state) expected = 'clutch,vehicle=cayman,vin=WP0AB29858U782772,mileage=79832,lap=3 released=0 1557955428021' self.assertEqual(expected, actual[0], 'The generated influxdb line protocol data for clutch was not as expected.') self.assertTrue('Clutch' not in self.test_state.get_dirty_fields(), 'Clutch still dirty after formatting.')
def testOilTemperature(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('DateTime', datetime(2019,5,15,21,23,48,21000,timezone.utc)) self.test_state.set_data_item('Oil_Temperature', 96) self.test_state.set_data_item('Lap', 3) actual = self.test_formatter.formatData(self.test_state) expected = 'oil_temperature,vehicle=cayman,vin=WP0AB29858U782772,mileage=79832,lap=3 value=96 1557955428021' self.assertEqual(expected, actual[0], 'The generated influxdb line protocol data for oil_temperature was not as expected.') self.assertTrue('Oil_Temperature' not in self.test_state.get_dirty_fields(), 'Oil_Temperature still dirty after formatting.')
def testBrake(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('DateTime', datetime(2019,5,15,21,23,48,21000,timezone.utc)) self.test_state.set_data_item('Brake', 1) self.test_state.set_data_item('Brake_Pressure', 42) self.test_state.set_data_item('Lap', 3) actual = self.test_formatter.formatData(self.test_state) expected = 'brake,vehicle=cayman,vin=WP0AB29858U782772,mileage=79832,lap=3 applied=1,pressure=42 1557955428021' self.assertEqual(expected, actual[0], 'The generated influxdb line protocol data for brake was not as expected.') self.assertTrue('Brake' not in self.test_state.get_dirty_fields(), 'Brake still dirty after formatting.') self.assertTrue('Brake_Pressure' not in self.test_state.get_dirty_fields(), 'Brake_Pressure still dirty after formatting.')
def testThrottle(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('DateTime', datetime(2019,5,15,21,23,48,21000,timezone.utc)) self.test_state.set_data_item('Throttle', 97) self.test_state.set_data_item('ECU_Throttle', 95) self.test_state.set_data_item('Lap', 3) actual = self.test_formatter.formatData(self.test_state) expected = 'throttle,vehicle=cayman,vin=WP0AB29858U782772,mileage=79832,lap=3 driver=97,ecu=95 1557955428021' self.assertEqual(expected, actual[0], 'The generated influxdb line protocol data for throttle was not as expected.') self.assertTrue('Throttle' not in self.test_state.get_dirty_fields(), 'Throttle still dirty after formatting.') self.assertTrue('ECU_Throttle' not in self.test_state.get_dirty_fields(), 'ECU_Throttle still dirty after formatting.')
def testSteering(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('DateTime', datetime(2019,5,15,21,23,48,21000,timezone.utc)) self.test_state.set_data_item('Steering_Angle', 6.21) self.test_state.set_data_item('Steering_Rate', 0.42) self.test_state.set_data_item('Lap', 3) actual = self.test_formatter.formatData(self.test_state) expected = 'steering,vehicle=cayman,vin=WP0AB29858U782772,mileage=79832,lap=3 angle=6.21,rate=0.42 1557955428021' self.assertEqual(expected, actual[0], 'The generated influxdb line protocol data for steering was not as expected.') self.assertTrue('Steering_Angle' not in self.test_state.get_dirty_fields(), 'Steering_Angle still dirty after formatting.') self.assertTrue('Steering_Rate' not in self.test_state.get_dirty_fields(), 'Steering_Rate still dirty after formatting.')
def buildThrottle(self, data): #throttle,vin=<vin>,lap=<lap> driver=<999>,ecu=<999> <timestamp> field_names = [ DataState.get_data_name_at_idx(DataState.names.Throttle), DataState.get_data_name_at_idx(DataState.names.ECU_Throttle) ] data.clean_fields(field_names) return "throttle,{0},lap={1} driver={2},ecu={3} ".format( self.tags, data.get_data_item(DataState.names[DataState.names.Lap]), data.get_data_item(DataState.names[DataState.names.Throttle]), data.get_data_item(DataState.names[DataState.names.ECU_Throttle]))
def buildSteering(self, data): #steering,vin=<vin>,lap=<lap> angle=<99999>,rate=<99999> <timestamp> field_names = [ DataState.get_data_name_at_idx(DataState.names.Steering_Angle), DataState.get_data_name_at_idx(DataState.names.Steering_Rate) ] data.clean_fields(field_names) return "steering,{0},lap={1} angle={2},rate={3} ".format( self.tags, data.get_data_item(DataState.names[DataState.names.Lap]), data.get_data_item( DataState.names[DataState.names.Steering_Angle]), data.get_data_item(DataState.names[DataState.names.Steering_Rate]))
def buildBrake(self, data): #brake,vin=<vin>,lap=<lap> applied=[0/1],pressure=<999> <timestamp> field_names = [ DataState.get_data_name_at_idx(DataState.names.Brake), DataState.get_data_name_at_idx(DataState.names.Brake_Pressure) ] data.clean_fields(field_names) return "brake,{0},lap={1} applied={2},pressure={3} ".format( self.tags, data.get_data_item(DataState.names[DataState.names.Lap]), data.get_data_item(DataState.names[DataState.names.Brake]), data.get_data_item( DataState.names[DataState.names.Brake_Pressure]))
def testPModes(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('DateTime', datetime(2019,5,15,21,23,48,21000,timezone.utc)) self.test_state.set_data_item('Sport_Mode', 1) self.test_state.set_data_item('Pasm_Sport_Mode', 1) self.test_state.set_data_item('PSM_Disable', 0) self.test_state.set_data_item('Lap', 3) actual = self.test_formatter.formatData(self.test_state) expected = 'pmodes,vehicle=cayman,vin=WP0AB29858U782772,mileage=79832,lap=3 sport=1,pasm_sport=1,psm_off=0 1557955428021' self.assertEqual(expected, actual[0], 'The generated influxdb line protocol data for pmodes was not as expected.') self.assertTrue('Sport_Mode' not in self.test_state.get_dirty_fields(), 'Sport_Mode still dirty after formatting.') self.assertTrue('Pasm_Sport_Mode' not in self.test_state.get_dirty_fields(), 'Pasm_Sport_Mode still dirty after formatting.') self.assertTrue('PSM_Disable' not in self.test_state.get_dirty_fields(), 'PSM_Disable still dirty after formatting.')
def buildLocation(self, data): #location,vin=<vin>,lap=<lap>,geohash=<geohash> latitude=<999.999999>,longitude=<999.99999>,altitude=<9999> <timestamp> field_names = [ DataState.get_data_name_at_idx(DataState.names.Latitude), DataState.get_data_name_at_idx(DataState.names.Longitude) ] data.clean_fields(field_names) return "location,{0},lap={1},geohash={2} latitude={3},longitude={4},altitude={5} ".format( self.tags, data.get_data_item(DataState.names[DataState.names.Lap]), '00000000', data.get_data_item(DataState.names[DataState.names.Latitude]), data.get_data_item(DataState.names[DataState.names.Longitude]), data.get_data_item(DataState.names[DataState.names.Altitude]))
def buildAcceleration(self, data): #acceleration,vin=<vin>,lap=<lap> x=<xg>,y=<yg>,z=<zg> <timestamp> field_names = [ DataState.get_data_name_at_idx(DataState.names.X), DataState.get_data_name_at_idx(DataState.names.Y), DataState.get_data_name_at_idx(DataState.names.Z) ] data.clean_fields(field_names) return "acceleration,{0},lap={1} x={2},y={3},z={4} ".format( self.tags, data.get_data_item(DataState.names[DataState.names.Lap]), data.get_data_item(DataState.names[DataState.names.X]), data.get_data_item(DataState.names[DataState.names.Y]), data.get_data_item(DataState.names[DataState.names.Z]))
class Test(unittest.TestCase): def setUp(self): self.test_state = DataState() self.test_parser = AccelerometerParser(self.test_state) def testParse(self): test_line = "$AC001,477.72,524,598,626" self.test_parser.parse(test_line) self.assertEqual(477.72, self.test_state.get_data_item(DataState.get_data_name_at_idx(DataState.names.Time)), 'Time was not parsed correctly.') self.assertAlmostEqual(0.23, self.test_state.get_data_item(DataState.get_data_name_at_idx(DataState.names.X)), 2, 'X acceleration was not parsed correctly.') self.assertAlmostEqual(0.84, self.test_state.get_data_item(DataState.get_data_name_at_idx(DataState.names.Y)), 2, 'Y acceleration was not parsed correctly.') self.assertAlmostEqual(1.03, self.test_state.get_data_item(DataState.get_data_name_at_idx(DataState.names.Z)), 2, 'Z acceleration was not parsed correctly.') pass
def buildPModes(self, data): #pmodes,vin=<vin>,lap=<lap> sport=[0/1],pasm_sport=[0/1],psm_off=[0/1] <timestamp> field_names = [ DataState.get_data_name_at_idx(DataState.names.Sport_Mode), DataState.get_data_name_at_idx(DataState.names.Pasm_Sport_Mode), DataState.get_data_name_at_idx(DataState.names.PSM_Disable) ] data.clean_fields(field_names) return "pmodes,{0},lap={1} sport={2},pasm_sport={3},psm_off={4} ".format( self.tags, data.get_data_item(DataState.names[DataState.names.Lap]), data.get_data_item(DataState.names[DataState.names.Sport_Mode]), data.get_data_item( DataState.names[DataState.names.Pasm_Sport_Mode]), data.get_data_item(DataState.names[DataState.names.PSM_Disable]))
def testLocation(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('DateTime', datetime(2019,5,15,21,23,48,21000,timezone.utc)) self.test_state.set_data_item('GPS_Time', '21:23:48.021') self.test_state.set_data_item('GPS_Date', '15-05-19') self.test_state.set_data_item('Latitude', 39.739242) self.test_state.set_data_item('Longitude', 104.9903299) self.test_state.set_data_item('Altitude', 1609) self.test_state.set_data_item('Lap', 3) actual = self.test_formatter.formatData(self.test_state) expected = 'location,vehicle=cayman,vin=WP0AB29858U782772,mileage=79832,lap=3,geohash=00000000 latitude=39.739242,longitude=104.9903299,altitude=1609 1557955428021' self.assertEqual(expected, actual[0], 'The generated influxdb line protocol data for locaation was not as expected.') self.assertTrue('Latitude' not in self.test_state.get_dirty_fields(), 'Latitude still dirty after formatting.') self.assertTrue('Longitude' not in self.test_state.get_dirty_fields(), 'Longitude still dirty after formatting.')
def buildWheelSpeed(self, data): #c<timestamp> field_names = [ DataState.get_data_name_at_idx(DataState.names.LF_KPH), DataState.get_data_name_at_idx(DataState.names.RF_KPH), DataState.get_data_name_at_idx(DataState.names.LR_KPH), DataState.get_data_name_at_idx(DataState.names.RR_KPH) ] data.clean_fields(field_names) return "wheel_speed,{0},lap={1} left_front={2},right_front={3},left_rear={4},right_rear={5} ".format( self.tags, data.get_data_item(DataState.names[DataState.names.Lap]), data.get_data_item(DataState.names[DataState.names.LF_KPH]), data.get_data_item(DataState.names[DataState.names.RF_KPH]), data.get_data_item(DataState.names[DataState.names.LR_KPH]), data.get_data_item(DataState.names[DataState.names.RR_KPH]))
def testAcceleration(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('DateTime', datetime(2019,5,15,21,23,48,21000,timezone.utc)) self.test_state.set_data_item('GPS_Time', '21:23:48.021') self.test_state.set_data_item('GPS_Date', '15-05-19') self.test_state.set_data_item('X', 0.15) self.test_state.set_data_item('Y', 0.86) self.test_state.set_data_item('Z', 1.18) self.test_state.set_data_item('Lap', 3) actual = self.test_formatter.formatData(self.test_state) expected = 'acceleration,vehicle=cayman,vin=WP0AB29858U782772,mileage=79832,lap=3 x=0.15,y=0.86,z=1.18 1557955428021' self.assertEqual(expected, actual[0], 'The generated influxdb line protocol data for acceleration was not as expected.') self.assertTrue('X' not in self.test_state.get_dirty_fields(), 'X still dirty after formatting.') self.assertTrue('Y' not in self.test_state.get_dirty_fields(), 'Y still dirty after formatting.') self.assertTrue('Z' not in self.test_state.get_dirty_fields(), 'Z still dirty after formatting.')
def formatHeading(self, data_state): print("Formatting header...") csv_line = DataState.names[DataState.names.Time] for idx in range(DataState.names.GPS_Time, DataState.names.EOL): csv_line += ", " csv_line += DataState.get_data_name_at_idx(idx) return csv_line
def testWheelSpeed(self): self.test_state = DataState() self.test_state.set_data_item('Time', 321.36) self.test_state.set_data_item('DateTime', datetime(2019,5,15,21,23,48,21000,timezone.utc)) self.test_state.set_data_item('LF_KPH', 85.2) self.test_state.set_data_item('RF_KPH', 86.9) self.test_state.set_data_item('LR_KPH', 85.0) self.test_state.set_data_item('RR_KPH', 86.7) self.test_state.set_data_item('Lap', 3) actual = self.test_formatter.formatData(self.test_state) expected = 'wheel_speed,vehicle=cayman,vin=WP0AB29858U782772,mileage=79832,lap=3 left_front=85.2,right_front=86.9,left_rear=85.0,right_rear=86.7 1557955428021' self.assertEqual(expected, actual[0], 'The generated influxdb line protocol data for wheel_speed was not as expected.') self.assertTrue('LF_KPH' not in self.test_state.get_dirty_fields(), 'LF_KPH still dirty after formatting.') self.assertTrue('RF_KPH' not in self.test_state.get_dirty_fields(), 'RF_KPH still dirty after formatting.') self.assertTrue('LR_KPH' not in self.test_state.get_dirty_fields(), 'LR_KPH still dirty after formatting.') self.assertTrue('RR_KPH' not in self.test_state.get_dirty_fields(), 'RR_KPH still dirty after formatting.')
def buildRPM(self, data): #rpm,vin=<vin>,lap=<lap> value=<9999> <timestamp> field_names = [DataState.get_data_name_at_idx(DataState.names.RPM)] data.clean_fields(field_names) return "rpm,{0},lap={1} value={2} ".format( self.tags, data.get_data_item(DataState.names[DataState.names.Lap]), data.get_data_item(DataState.names[DataState.names.RPM]))
def buildClutch(self, data): #clutch,vin=<vin>,lap=<lap> released=[0/1] <timestamp> field_names = [DataState.get_data_name_at_idx(DataState.names.Clutch)] data.clean_fields(field_names) return "clutch,{0},lap={1} released={2} ".format( self.tags, data.get_data_item(DataState.names[DataState.names.Lap]), data.get_data_item(DataState.names[DataState.names.Clutch]))
def testFrame246(self): test_fields = [ "$CNDRV", "476.72", "246", "0B", "00", "C8", "E1", "58", "C3", "65", "00" ] test_extractor = CanFrame246Extractor() test_extractor.extractData(test_fields, CanFrameParserTest.test_state) self.assertEqual( 3, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Gear)), 'Gear indicator was not parsed correctly.') self.assertAlmostEqual( 88, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Throttle)), 2, 'ECU commanded throttle was not parsed correctly.') pass
def buildOilPressure(self, data): #oil_pressure,vin=<vin>,lap=<lap> value=<oil-pressure> <timestamp> field_names = [ DataState.get_data_name_at_idx(DataState.names.Oil_Pressure) ] data.clean_fields(field_names) return "oil_pressure,{0},lap={1} value={2} ".format( self.tags, data.get_data_item(DataState.names[DataState.names.Lap]), data.get_data_item(DataState.names[DataState.names.Oil_Pressure]))
def testFrame441(self): test_fields = [ "$CNDRV", "476.72", "441", "0B", "10", "C8", "10", "0E", "67", "82", "10" ] test_extractor = CanFrame441Extractor() test_extractor.extractData(test_fields, CanFrameParserTest.test_state) self.assertAlmostEqual( 89.33, self.test_state.get_data_item( DataState.get_data_name_at_idx( DataState.names.Oil_Temperature)), 2, 'Oil temperature was not parsed correctly.') self.assertEqual( 325, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Oil_Pressure)), 'Oil pressure was not parsed correctly.') pass
def testParserFrame246(self): test_line = "$CNDRV,478.50,246,04,00,C8,FA,58,C3,65,00" CanFrameParserTest.test_parser.parse(test_line) self.assertEqual( 478.50, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Time)), 'Time was not parsed correctly.') self.assertEqual( 4, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Gear)), 'Gear indicator was not parsed correctly.') self.assertAlmostEqual( 98, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Throttle)), 2, 'ECU commanded throttle was not parsed correctly.') pass
def testFrame245(self): test_fields = [ "$CNDRV", "476.72", "245", "01", "6C", "02", "00", "58", "00", "65", "00" ] test_extractor = CanFrame245Extractor() test_extractor.extractData(test_fields, CanFrameParserTest.test_state) self.assertEqual( 96, self.test_state.get_data_item( DataState.get_data_name_at_idx( DataState.names.Coolant_Temperature)), 'Coolant temperature was not parsed correctly.') self.assertEqual( 1, self.test_state.get_data_item( DataState.get_data_name_at_idx(DataState.names.Brake)), 'Brake pedal was not parsed correctly.') pass
def buildCoolant(self, data): #coolant_temperature,vin=<vin>,lap=<lap> value=<coolant-temperature> <timestamp> field_names = [ DataState.get_data_name_at_idx(DataState.names.Coolant_Temperature) ] data.clean_fields(field_names) return "coolant_temperature,{0},lap={1} value={2} ".format( self.tags, data.get_data_item(DataState.names[DataState.names.Lap]), data.get_data_item( DataState.names[DataState.names.Coolant_Temperature]))