# This file is part of Scapy
# See http://www.secdev.org/projects/scapy for more information
# Copyright (C) Andreas Korb <andreas.d.korb@gmail.com>
# Copyright (C) Nils Weiss <nils@we155.de>
# This program is published under a GPLv2 license

# scapy.contrib.status = skip

from scapy.fields import StrFixedLenField, FlagsField, ScalingField, BitField
from scapy.contrib.automotive.obd.packet import OBD_Packet


# See https://en.wikipedia.org/wiki/OBD-II_PIDs for further information
# PID = Parameter IDentification

class OBD_PID80(OBD_Packet):
    name = "PID_80_PIDsSupported"
    fields_desc = [
        FlagsField('supported_pids', 0, 32, [
            'PIDA0',
            'PID9F',
            'PID9E',
            'PID9D',
            'PID9C',
            'PID9B',
            'PID9A',
            'PID99',
            'PID98',
            'PID97',
            'PID96',
            'PID95',
            'PID94',
            'PID93',
            'PID92',
            'PID91',
            'PID90',
            'PID8F',
            'PID8E',
            'PID8D',
            'PID8C',
            'PID8B',
            'PID8A',
            'PID89',
            'PID88',
            'PID87',
            'PID86',
            'PID85',
            'PID84',
            'PID83',
            'PID82',
            'PID81'
        ])
    ]


class OBD_PID81(OBD_Packet):
    name = "PID_81_EngineRunTimeForAuxiliaryEmissionsControlDevice"
    fields_desc = [
        BitField('reserved', 0, 3),
        BitField('total_run_time_with_ei_aecd5_supported', 0, 1),
        BitField('total_run_time_with_ei_aecd4_supported', 0, 1),
        BitField('total_run_time_with_ei_aecd3_supported', 0, 1),
        BitField('total_run_time_with_ei_aecd2_supported', 0, 1),
        BitField('total_run_time_with_ei_aecd1_supported', 0, 1),
        ScalingField('total_run_time_with_ei_aecd1', 0, unit='sec',
                     fmt='Q'),
        ScalingField('total_run_time_with_ei_aecd2', 0, unit='sec',
                     fmt='Q'),
        ScalingField('total_run_time_with_ei_aecd3', 0, unit='sec',
                     fmt='Q'),
        ScalingField('total_run_time_with_ei_aecd4', 0, unit='sec',
                     fmt='Q'),
        ScalingField('total_run_time_with_ei_aecd5', 0, unit='sec',
                     fmt='Q'),
    ]


class OBD_PID82(OBD_Packet):
    name = "PID_82_EngineRunTimeForAuxiliaryEmissionsControlDevice"
    fields_desc = [
        BitField('reserved', 0, 3),
        BitField('total_run_time_with_ei_aecd10_supported', 0, 1),
        BitField('total_run_time_with_ei_aecd9_supported', 0, 1),
        BitField('total_run_time_with_ei_aecd8_supported', 0, 1),
        BitField('total_run_time_with_ei_aecd7_supported', 0, 1),
        BitField('total_run_time_with_ei_aecd6_supported', 0, 1),
        ScalingField('total_run_time_with_ei_aecd6', 0, unit='sec',
                     fmt='Q'),
        ScalingField('total_run_time_with_ei_aecd7', 0, unit='sec',
                     fmt='Q'),
        ScalingField('total_run_time_with_ei_aecd8', 0, unit='sec',
                     fmt='Q'),
        ScalingField('total_run_time_with_ei_aecd9', 0, unit='sec',
                     fmt='Q'),
        ScalingField('total_run_time_with_ei_aecd10', 0, unit='sec',
                     fmt='Q'),
    ]


class OBD_PID83(OBD_Packet):
    name = "PID_83_NOxSensor"
    fields_desc = [
        BitField('reserved', 0, 6),
        BitField('nox_sensor_concentration_bank2_sensor1_supported', 0, 1),
        BitField('nox_sensor_concentration_bank1_sensor1_supported', 0, 1),
        ScalingField('nox_sensor_concentration_bank1_sensor1', 0, unit='ppm',
                     fmt='H'),
        ScalingField('nox_sensor_concentration_bank2_sensor1', 0, unit='ppm',
                     fmt='H'),
    ]


class OBD_PID84(OBD_Packet):
    name = "PID_84_ManifoldSurfaceTemperature"
    fields_desc = [
        StrFixedLenField('data', b'', 1)
    ]


class OBD_PID85(OBD_Packet):
    name = "PID_85_NoxReagentSystem"
    fields_desc = [
        StrFixedLenField('data', b'', 10)
    ]


class OBD_PID86(OBD_Packet):
    name = "PID_86_ParticulateMatterSensor"
    fields_desc = [
        StrFixedLenField('data', b'', 5)
    ]


class OBD_PID87(OBD_Packet):
    name = "PID_87_IntakeManifoldAbsolutePressure"
    fields_desc = [
        StrFixedLenField('data', b'', 5)
    ]


class OBD_PID88(OBD_Packet):
    name = "PID_88_ScrInduceSystem"
    fields_desc = [
        StrFixedLenField('data', b'', 13)
    ]


class OBD_PID89(OBD_Packet):
    # 11 - 15
    name = "PID_89_RunTimeForAecd"
    fields_desc = [
        StrFixedLenField('data', b'', 41)
    ]


class OBD_PID8A(OBD_Packet):
    # 16 - 20
    name = "PID_8A_RunTimeForAecd"
    fields_desc = [
        StrFixedLenField('data', b'', 41)
    ]


class OBD_PID8B(OBD_Packet):
    name = "PID_8B_DieselAftertreatment"
    fields_desc = [
        StrFixedLenField('data', b'', 7)
    ]


class OBD_PID8C(OBD_Packet):
    name = "PID_8C_O2Sensor"
    fields_desc = [
        StrFixedLenField('data', b'', 16)
    ]


class OBD_PID8D(OBD_Packet):
    name = "PID_8D_ThrottlePositionG"
    fields_desc = [
        StrFixedLenField('data', b'', 1)
    ]


class OBD_PID8E(OBD_Packet):
    name = "PID_8E_EngineFrictionPercentTorque"
    fields_desc = [
        StrFixedLenField('data', b'', 1)
    ]


class OBD_PID8F(OBD_Packet):
    name = "PID_8F_PmSensorBank1And2"
    fields_desc = [
        StrFixedLenField('data', b'', 5)
    ]


class OBD_PID90(OBD_Packet):
    name = "PID_90_WwhObdVehicleObdSystemInformation"
    fields_desc = [
        StrFixedLenField('data', b'', 3)
    ]


class OBD_PID91(OBD_Packet):
    name = "PID_91_WwhObdVehicleObdSystemInformation"
    fields_desc = [
        StrFixedLenField('data', b'', 5)
    ]


class OBD_PID92(OBD_Packet):
    name = "PID_92_FuelSystemControl"
    fields_desc = [
        StrFixedLenField('data', b'', 2)
    ]


class OBD_PID93(OBD_Packet):
    name = "PID_93_WwhObdVehicleObdCountersSupport"
    fields_desc = [
        StrFixedLenField('data', b'', 3)
    ]


class OBD_PID94(OBD_Packet):
    name = "PID_94_NoxWarningAndInducementSystem"
    fields_desc = [
        StrFixedLenField('data', b'', 12)
    ]


class OBD_PID98(OBD_Packet):
    name = "PID_98_ExhaustGasTemperatureSensor"
    fields_desc = [
        StrFixedLenField('data', b'', 9)
    ]


class OBD_PID99(OBD_Packet):
    name = "PID_99_ExhaustGasTemperatureSensor"
    fields_desc = [
        StrFixedLenField('data', b'', 9)
    ]


class OBD_PID9A(OBD_Packet):
    name = "PID_9A_HybridEvVehicleSystemDataBatteryVoltage"
    fields_desc = [
        StrFixedLenField('data', b'', 6)
    ]


class OBD_PID9B(OBD_Packet):
    name = "PID_9B_DieselExhaustFluidSensorData"
    fields_desc = [
        StrFixedLenField('data', b'', 4)
    ]


class OBD_PID9C(OBD_Packet):
    name = "PID_9C_O2SensorData"
    fields_desc = [
        StrFixedLenField('data', b'', 17)
    ]


class OBD_PID9D(OBD_Packet):
    name = "PID_9D_EngineFuelRate"
    fields_desc = [
        StrFixedLenField('data', b'', 4)
    ]


class OBD_PID9E(OBD_Packet):
    name = "PID_9E_EngineExhaustFlowRate"
    fields_desc = [
        StrFixedLenField('data', b'', 2)
    ]


class OBD_PID9F(OBD_Packet):
    name = "PID_9F_FuelSystemPercentageUse"
    fields_desc = [
        StrFixedLenField('data', b'', 9)
    ]