hitl_tester.modules.cyber_6t.spn_types

A collection of integer to string mappings for decoding payload information.

(c) 2020-2024 TurnAround Factor, Inc.

#

CUI DISTRIBUTION CONTROL

Controlled by: DLA J68 R&D SBIP

CUI Category: Small Business Research and Technology

Distribution/Dissemination Controls: PROTECTED BY SBIR DATA RIGHTS

POC: GOV SBIP Program Manager Denise Price, 571-767-0111

Distribution authorized to U.S. Government Agencies only, to protect information not owned by the

U.S. Government and protected by a contractor’s ‘limited rights’ statement, or received with the understanding that

it is not routinely transmitted outside the U.S. Government (determination made September 14, 2024). Other requests

for this document shall be referred to ACOR DLA Logistics Operations (J-68), 8725 John J. Kingman Rd., Suite 4317,

Fort Belvoir, VA 22060-6221

#

SBIR DATA RIGHTS

Contract No.:SP4701-23-C-0083

Contractor Name: TurnAround Factor, Inc.

Contractor Address: 10365 Wood Park Ct. Suite 313 / Ashland, VA 23005

Expiration of SBIR Data Rights Period: September 24, 2029

The Government's rights to use, modify, reproduce, release, perform, display, or disclose technical data or computer

software marked with this legend are restricted during the period shown as provided in paragraph (b)(4) of the Rights

in Noncommercial Technical Data and Computer Software--Small Business Innovative Research (SBIR) Program clause

contained in the above identified contract. No restrictions apply after the expiration date shown above. Any

reproduction of technical data, computer software, or portions thereof marked with this legend must also reproduce

the markings.

   1"""
   2A collection of integer to string mappings for decoding payload information.
   3
   4# (c) 2020-2024 TurnAround Factor, Inc.
   5#
   6# CUI DISTRIBUTION CONTROL
   7# Controlled by: DLA J68 R&D SBIP
   8# CUI Category: Small Business Research and Technology
   9# Distribution/Dissemination Controls: PROTECTED BY SBIR DATA RIGHTS
  10# POC: GOV SBIP Program Manager Denise Price, 571-767-0111
  11# Distribution authorized to U.S. Government Agencies only, to protect information not owned by the
  12# U.S. Government and protected by a contractor’s ‘limited rights’ statement, or received with the understanding that
  13# it is not routinely transmitted outside the U.S. Government (determination made September 14, 2024). Other requests
  14# for this document shall be referred to ACOR DLA Logistics Operations (J-68), 8725 John J. Kingman Rd., Suite 4317,
  15# Fort Belvoir, VA 22060-6221
  16#
  17# SBIR DATA RIGHTS
  18# Contract No.:SP4701-23-C-0083
  19# Contractor Name: TurnAround Factor, Inc.
  20# Contractor Address: 10365 Wood Park Ct. Suite 313 / Ashland, VA 23005
  21# Expiration of SBIR Data Rights Period: September 24, 2029
  22# The Government's rights to use, modify, reproduce, release, perform, display, or disclose technical data or computer
  23# software marked with this legend are restricted during the period shown as provided in paragraph (b)(4) of the Rights
  24# in Noncommercial Technical Data and Computer Software--Small Business Innovative Research (SBIR) Program clause
  25# contained in the above identified contract. No restrictions apply after the expiration date shown above. Any
  26# reproduction of technical data, computer software, or portions thereof marked with this legend must also reproduce
  27# the markings.
  28"""
  29
  30from __future__ import annotations
  31
  32import bisect
  33from enum import IntEnum
  34from math import ceil
  35from typing import Callable
  36from typing_extensions import TypeAlias
  37
  38Stringify: TypeAlias = Callable[[int], str]  # Function that maps strings to integers
  39
  40
  41def bytes_map(value: int) -> str:
  42    """Format as hex."""
  43    return f"0x{value:02X}"
  44
  45
  46def ascii_map(value: int) -> str:
  47    """Format as an ascii string."""
  48    length = max(ceil(value.bit_length() / 8), 1)
  49    return value.to_bytes(length=length, byteorder="big").decode("ASCII")
  50
  51
  52def generate_map(mapping: dict[int, str] | str | list[str]):
  53    """
  54    Create a function mapping integers to strings with support for ranges.
  55
  56    dict = Ranged mapping, for example{0: x, 4: y} == {0 to 3: x, 4: y}
  57    str = all ints map to this string
  58    list = Indexed mapping starting from 0, for example [w, x, y] == {0: w, 1: x, 2: y}
  59    """
  60
  61    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
  62        if isinstance(mapping, dict):
  63            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
  64        if isinstance(mapping, str):
  65            return mapping
  66        if isinstance(mapping, list):
  67            return mapping[value] if 0 <= value < len(mapping) else ""
  68
  69    return mapping_func
  70
  71
  72integer = generate_map("")
  73bool_map = generate_map(["False", "True"])
  74celsius = generate_map("Celsius")
  75fahrenheit = generate_map("Fahrenheit")
  76seconds = generate_map("Seconds")
  77minutes = generate_map("Minutes")
  78hours = generate_map("Hours")
  79days = generate_map("Days")
  80months = generate_map("Months")
  81percent = generate_map("%")
  82ah = generate_map("Ah")
  83volts = generate_map("Volts")
  84amps = generate_map("Amps")
  85watts = generate_map("Watts")
  86
  87
  88# J1939 Addresses
  89class Address(IntEnum):
  90    """Some common addresses."""
  91
  92    FILE_SERVER_PRINTER = 248
  93    DIAGNOSTIC_TOOL_2 = 249
  94    DIAGNOSTIC_TOOL_1 = 250
  95    ON_BOARD_DATA_LOGGER = 251
  96    EXPERIMENTAL = 252
  97    OEM = 253
  98    NULL = 254
  99    GLOBAL = 255
 100
 101
 102addresses = generate_map(
 103    {
 104        0: "Unknown",
 105        248: "On-board file and/or print server",
 106        249: "Diagnostic tool #2",  # The address for the second off board diagnostic service tool
 107        250: "Diagnostic tool #1",  # The address for the first off board diagnostic service tool
 108        251: "On-board data logger",
 109        252: "Experimental",
 110        253: "OEM",
 111        254: "Null",  # Only for use in J1939-81 to indicate the controller has not yet successfully claimed an address
 112        255: "Global",  # Indicates the J1939 message is being sent to all controllers
 113    }
 114)
 115
 116
 117# Name
 118industry_group = generate_map(
 119    {
 120        0: "Global, applies to all",
 121        1: "On-Highway Equipment",
 122        2: "Agricultural and Forestry Equipment",
 123        3: "Construction Equipment",
 124        4: "Marine",
 125        5: "Industrial-Process Control-Stationary (Gen-Sets)",
 126        6: "Reserved",
 127    }
 128)
 129
 130vehicle_system = generate_map(
 131    {
 132        0: "Unknown",
 133        127: "Not Available",
 134        128: "Unknown",
 135    }
 136)
 137
 138function_id = generate_map(
 139    {
 140        0: "Engine",
 141        1: "Auxiliary Power Unit (APU)",
 142        2: "Electric Propulsion Control",
 143        3: "Transmission",
 144        4: "Battery Pack Monitor",
 145        5: "Shift Control/Console",
 146        6: "Power TakeOff - (Main or Rear)",
 147        7: "Axle - Steering",
 148        8: "Axle - Drive",
 149        9: "Brakes - System Controller",
 150        10: "Brakes - Steer Axle",
 151        11: "Brakes - Drive axle",
 152        12: "Retarder - Engine",
 153        13: "Retarder - Driveline",
 154        14: "Cruise Control",
 155        15: "Fuel System",
 156        16: "Steering Controller",
 157        17: "Suspension - Steer Axle",
 158        18: "Suspension - Drive Axle",
 159        19: "Instrument Cluster",
 160        20: "Trip Recorder",
 161        21: "Cab Climate Control",
 162        22: "Aerodynamic Control",
 163        23: "Vehicle Navigation",
 164        24: "Vehicle Security",
 165        25: "Network Interconnect ECU",
 166        26: "Body Controller",
 167        27: "Power TakeOff (Secondary or Front)",
 168        28: "Off Vehicle Gateway",
 169        29: "Virtual Terminal (in cab)",
 170        30: "Management Computer",
 171        31: "Propulsion Battery Charger",
 172        32: "Headway Controller",
 173        33: "System Monitor",
 174        34: "Hydraulic Pump Controller",
 175        35: "Suspension - System Controller",
 176        36: "Pneumatic - System Controller",
 177        37: "Cab Controller",
 178        38: "Tire Pressure Control",
 179        39: "Ignition Control Module",
 180        40: "Seat Control",
 181        41: "Lighting - Operator Controls",
 182        42: "Water Pump Control",
 183        43: "Transmission Display",
 184        44: "Exhaust Emission Control",
 185        45: "Vehicle Dynamic Stability Control",
 186        46: "Oil Sensor Unit",
 187        47: "Information System Controller",
 188        48: "Ramp Control",
 189        49: "Clutch/Converter Control",
 190        50: "Auxiliary Heater",
 191        51: "Forward-Looking Collision Warning System",
 192        52: "Chassis Controller",
 193        53: "Alternator/Charging System",
 194        54: "Communications Unit, Cellular",
 195        55: "Communications Unit, Satellite",
 196        56: "Communications Unit, Radio",
 197        57: "Steering Column Unit",
 198        58: "Fan Drive Control",
 199        59: "Starter",
 200        60: "Cab Display",
 201        61: "File Server / Printer",
 202        62: "On-Board Diagnostic Unit",
 203        63: "Engine Valve Controller",
 204        64: "Endurance Braking",
 205        65: "Gas Flow Measurement",
 206        66: "I/O Controller",
 207        67: "Electrical System Controller",
 208        68: "Aftertreatment system gas measurement",
 209        69: "Engine Emission Aftertreatment System",
 210        70: "Auxiliary Regeneration Device",
 211        71: "Transfer Case Control",
 212        72: "Coolant Valve Controller",
 213        73: "Rollover Detection Control",
 214        74: "Lubrication System",
 215        75: "Supplemental Fan",
 216        76: "Temperature Sensor",
 217        77: "Fuel Properties Sensor",
 218        78: "Fire Suppression System",
 219        79: "Power Systems Manager",
 220        80: "Electric Powertrain",
 221        81: "Hydraulic Powertrain",
 222        82: "File Server",
 223        83: "Printer",
 224        84: "Start Aid Device",
 225        85: "Engine Injection Control Module",
 226        86: "Reserved",
 227    }
 228)
 229
 230manufacturer_id = generate_map(
 231    {
 232        0: "Reserved",
 233        1: "Bendix Commercial Vehicle Systems LLC (formerly Allied Signal Inc.)",
 234        2: "Allison Transmission, Inc.",
 235        3: "Ametek, US Gauge Division",
 236        4: "Ametek-Dixson",
 237        5: "AMP Inc.",
 238        6: "Berifors Electronics AB",
 239        7: "Case Corp.",
 240        8: "Caterpillar Inc.",
 241        9: "Chrysler Corp.",
 242        10: "Cummins Inc (formerly Cummins Engine Co)",
 243        11: "Dearborn Group Inc.",
 244        12: "Deere & Company, Precision Farming",
 245        13: "Delco Electronics",
 246        14: "Detroit Diesel Corporation",
 247        15: "DICKEY-john Corporation",
 248        16: "Eaton Corp",
 249        17: "Eaton Corp, Corp Res & Dev",
 250        18: "Eaton Corp, Transmission Div.",
 251        19: "Eaton Corp. Trucking Info Services",
 252        20: "Eaton Ltd",
 253        21: "Echlin Inc., Midland Brake Inc.",
 254        22: "Ford Motor Co., Electronic Concepts & Systems",
 255        23: "Ford Motor Co., Heavy Truck",
 256        24: "Ford Motor Co., Vehicle Controls",
 257        25: "Daimler Trucks North America LLC (formerly Freightliner LLC)",
 258        26: "General Motors Corp, Service Technology Grp",
 259        27: "GMC",
 260        28: "Grote Ind. Inc.",
 261        29: "Hino Motors Ltd.",
 262        30: "Isuzu Motors Ltd",
 263        31: "J Pollak Corp",
 264        32: "Jacobs Vehicle Systems",
 265        33: "John Deere",
 266        34: "Kelsey Hayes Co.",
 267        35: "Kenworth Truck Co.",
 268        36: "Lucas Ind.",
 269        37: "Mack Trucks Inc.",
 270        38: "Micro Processor Systems Inc.",
 271        39: "Microfirm Inc.",
 272        40: "Motorola AIEG Inc.",
 273        41: "Motorola Inc.",
 274        42: "International Truck and Engine Corporation - Engine Electronics "
 275        "(formerly Navistar Intl Trans Co., Engine Electronics)",
 276        43: "International Truck and Engine Corporation - Vehicle Electronics (formerly Navistar Intl Trans Corp.)",
 277        44: "Nippondenso Co. Ltd.",
 278        45: "PACCAR",
 279        46: "Noregon Systems, Inc  (formerly Parasoft Computing Solutions)",
 280        47: "Phillips Semiconductor",
 281        48: "Pollak Alphabet",
 282        49: "RE America Inc.",
 283        50: "Robert Bosch Corp",
 284        51: "Robert Bosch GmbH",
 285        52: "Meritor Automotive, Inc. (formerly Rockwell Automotive)",
 286        53: "Continental Automotive Systems US, Inc. (formerly Rockwell Land Transportation)",
 287        54: "Meritor Wabco",
 288        55: "Ryder System Inc.",
 289        56: "SAIC",
 290        57: "Danfoss  (formerly Sauer Sundstrand Co, then Sauer-Danfoss Co)",
 291        58: "SPX Corporation, OTC Div",
 292        59: "VES Inc.",
 293        60: "Volvo Trucks North America Inc.",
 294        61: "Volvo Truck Corp.",
 295        62: "Wabco",
 296        63: "ZF Industries Inc.",
 297        64: "Unused (formerly SpectraPrecision Laserplane, then SpectraPhysics)",
 298        65: "MAN Nutzfahrzeuge AG",
 299        66: "John Deere Construction Equipment Division",
 300        67: "John Deere Coffeyville Works (formerly Funk Manufacturing Company)",
 301        68: "Scania",
 302        69: "Trimble Navigation",
 303        70: "Flex-coil Limited",
 304        71: "Vansco Electronics Ltd.",
 305        72: "Sisu Corporation",
 306        73: "LeTourneau, Inc.",
 307        74: "Eaton Axle-Brake Division",
 308        75: "Deere & Co, Agricultural Division",
 309        76: "unused (formerly Deere & Co, Construction Division)",
 310        77: "Deere Power Systems Group",
 311        78: "Frank W. Murphy Manufacturing, Inc",
 312        79: "Daimler Benz AG - Engine Division (PBM)",
 313        80: "Twin Disc, Inc.",
 314        81: "Fire Research Corp.",
 315        82: "Bobcat/Ingersoll-Rand (formerly Melroe/Ingersoll-Rand)",
 316        83: "Bendix VORAD Technologies (formerly Eaton VORAD Technologies)",
 317        84: "New Holland UK Limited",
 318        85: "Kohler Co",
 319        86: "C. E. Niehoff & Company",
 320        87: "J.C. Bamford Excavators Ltd (JCB)",
 321        88: "Hemisphere GPS Inc (formerly Satloc Precision GPS)",
 322        89: "Kverneland Group, Electronics Division",
 323        90: "Knorr-Bremse SfN GmbH",
 324        91: "BSG Bodensee Steuergeraete GmbH",
 325        92: "Ag-Chem Equipment Co., Inc.",
 326        93: "Perkins Engines Company Ltd.",
 327        94: "CNH Industrial N.V. (formerly CNH Global N.V.)",
 328        95: "Pacific Insight Electronics Corp.",
 329        96: "Mech@tronic IT GmbH",
 330        97: "Ag Leader Technology, Inc.",
 331        98: "Mueller-Elektronik GmbH & Co",
 332        99: "International Transmissions Ltd (ITL)",
 333        100: "VDO Technik AG",
 334        101: "Sensoria",
 335        102: "AGCO (formerly AGCO GmbH & Co.)",
 336        103: "CLAAS E-Systems KGaA mbH & Co. KG (formerly CLAAS Agrosystems GmbH & Co. KG)",
 337        104: "CLAAS KGaA mbH (formerly CLAAS Selbstfahrende Erntemaschinen GmbH)",
 338        105: "Kiepe Elektrik GmbH & Co. KG",
 339        106: "BAE Systems Controls, Inc.",
 340        107: "Grimme Landmaschinen GmbH & Co. KG",
 341        108: "WTK-Elecktronik GmbH",
 342        109: "TeeJet Technologies Denmark (formerly LH Technologies ApS)",
 343        110: "EPIQ Sensor-Nite",
 344        111: "Maschinenfabrik Bernard Krone GmbH",
 345        112: "MECALAC",
 346        113: "Stress-Tek, Inc.",
 347        114: "EControls, Inc.",
 348        115: "NACCO Materials Handling Group, Inc.",
 349        116: "BEELINE Technologies",
 350        117: "HUSCO International",
 351        118: "Intron GmbH",
 352        119: "IntegriNautics  ",
 353        120: "RDS Technology Ltd",
 354        121: "HED (Hydro Electronic Devices, Inc.)",
 355        122: "FG Wilson (Engineering) Limited",
 356        123: "Basler Electric",
 357        124: "Hydac Electronic",
 358        125: "Nevada Automotive Test Center",
 359        126: "Driver Tech",
 360        127: "Holland USA",
 361        128: "Gerhard Duecker GmbH & Co. KG",
 362        129: "OMNEX Control Systems Inc.",
 363        130: "Nido - Universal Machines B.V.",
 364        131: "ITT Industries",
 365        132: "Mulag-Fahrzeugwerk",
 366        133: "Bucher Schoerling GmbH",
 367        134: "Iris Technology Ltd",
 368        135: "Airmar Technology Corporation",
 369        136: "Komatsu Ltd",
 370        137: "Maretron",
 371        138: "Georg Fritzmeier GmbH & Co. KG",
 372        139: "Caterpillar Trimble Control Technologies (CTCT), LLC",
 373        140: "Lowrance Electronics, Inc.",
 374        141: "Thales Navigation Ltd.",
 375        142: "TRW Automotive (Commercial Steering Systems)",
 376        143: "W. Gmeiner GmbH & Co.",
 377        144: "Mercury Marine",
 378        145: "MurCal Controls",
 379        146: "Maxima Technologies",
 380        147: "Nautibus electronic GmbH",
 381        148: "Blue Water Data, Inc.",
 382        149: "Holset",
 383        150: "Fleetguard",
 384        151: "Raven Industries, Inc.",
 385        152: "elobau GmbH & Co. KG",
 386        153: "Woodward, Industrial Controls Division",
 387        154: "Westerbeke Corporation",
 388        155: "Vetronix Corporation",
 389        156: "ITT Industries - Cannon",
 390        157: "ISSPRO Inc.",
 391        158: "Firestone Industrial Products Company",
 392        159: "NTech Industries Inc",
 393        160: "Nido",
 394        161: "Offshore Systems (UK) Ltd",
 395        162: "Axiomatic Technologies",
 396        163: "BRP Inc.",
 397        164: "MTU Friedrichshafen GmbH (formerly DaimlerChrysler Off-Highway)",
 398        165: "CPAC Systems AB",
 399        166: "John Deere Electronic Solutions (formerly Phoenix International)",
 400        167: "JLG Industries Inc",
 401        168: "Xantrex",
 402        169: "Marlin Technologies Inc.",
 403        170: "Computronics Corporation Ltd.",
 404        171: "Topcon Electronics GmbH & Co. KG (formerly Wachendorff Elektronik GmbH & Co. KG)",
 405        172: "Yanmar Co., Ltd. (formerly Yanmar Marine USA)",
 406        173: "Ryeso, Inc.",
 407        174: "AB Volvo Penta",
 408        175: "Veris Technologies, Inc.",
 409        176: "Moritz Aerospace",
 410        177: "Diagnostic Systems Associates",
 411        178: "Continental Automotive GmbH (formerly Siemens VDO Automotive AG)",
 412        179: "TeeJet Technologies Springfield (formerly Midwest Technologies Illinois, LLC)",
 413        180: "Smart Power Systems",
 414        181: "Coretronics, Inc.",
 415        182: "Vehicle Systems Engineering B.V.",
 416        183: "KDS Controls, Inc",
 417        184: "EIA Electronics",
 418        185: "Beede Electrical Instrument Company",
 419        186: "Altronic, Inc",
 420        187: "Air-Weigh",
 421        188: "EMP Corp",
 422        189: "QUALCOMM",
 423        190: "Hella KGaA Hueck & Co",
 424        191: "XRS Corporation (formerly XATA Corporation)",
 425        192: "Floscan",
 426        193: "Jeppesen Marine",
 427        194: "TriMark Corporation",
 428        195: "General Engine Products",
 429        196: "LEMKEN GmbH & Co KG",
 430        197: "Mechron Power Systems",
 431        198: "Mystic Valley Communications",
 432        199: "ACTIA Group (formerly Actia Corp)",
 433        200: "MGM Brakes",
 434        201: "Disenos y Tecnologia S.A.",
 435        202: "Curtis Instruments, Inc",
 436        203: "MILtronik GmbH",
 437        204: "The Morey Corporation",
 438        205: "SmarTire Systems Inc",
 439        206: "port GmbH",
 440        207: "Otto Engineering",
 441        208: "Drew Technologies, Inc",
 442        209: "Bell Equip. Co. SA (PTY) LTD",
 443        210: "Iteris, Inc.",
 444        211: "DNA Group",
 445        212: "Sure Power Industries, Inc",
 446        213: "CNH Belgium N.V.",
 447        214: "MC elettronica Srl",
 448        215: "Aetna Engineering/Fireboy-Xintex",
 449        216: "Paneltronics Inc.",
 450        217: "RM Michaelides Software & Elektronik GmbH",
 451        218: "Gits Manufacturing Company",
 452        219: "Cat OEM Solutions",
 453        220: "Beede Electrical Instrument Company, Inc",
 454        221: "SiE",
 455        222: "Generac Power Systems, Inc.",
 456        223: "Vaueo Retarder Co., Ltd.",
 457        224: "EMMI Network, S.L.",
 458        225: "SKF",
 459        226: "Monaco Coach Corporation",
 460        227: "Lykketronic A/S",
 461        228: "Unused (formerly ZF Marine Electronics)",
 462        229: "Garmin International Inc.",
 463        230: "Saucon Technologies",
 464        231: "Topcon Positioning Systems, Inc.",
 465        232: "TSD Integrated Controls",
 466        233: "Yacht Monitoring Solutions Inc.",
 467        234: "Mondial electronic GmbH",
 468        235: "SailorMade Marine Telemetry - Tetra Technology Ltd.",
 469        236: "NORAC Systems International Inc",
 470        237: "Agtron Enterprises Inc",
 471        238: "ZF Friedrichshafen AG",
 472        239: "May & Scofield Ltd",
 473        240: "Vanair Mfg",
 474        241: "Schneider Automation SAS",
 475        242: "Kokusandenki Co. Ltd",
 476        243: "eRide, Inc.",
 477        244: "Techno-Matic",
 478        245: "Capstan Ag Systems, Inc.",
 479        246: "Class 1, Inc",
 480        247: "ePULSE",
 481        248: "Cooper Standard Automotive Active Systems Group",
 482        249: "Schaltbau GmbH",
 483        250: "Kuhn Group",
 484        251: "German Agricultural Society, Test Center (DLG)",
 485        252: "Sensor-Technik Wiedemann GmbH",
 486        253: "Mobile Control Systems",
 487        254: "GE Sensing",
 488        255: "MEAS France",
 489        256: "Tyco Electronics AMP",
 490        257: "Honda Motor Co., Ltd",
 491        258: "ARAG",
 492        259: "Jetter AG",
 493        260: "Reichhardt GmbH Steuerungstechnik",
 494        261: "Red Dot Corporation",
 495        262: "HydraForce, Inc",
 496        263: "IMMI",
 497        264: "Autolync",
 498        265: "MTS Sensor Technologie GmbH",
 499        266: "International Thermal Research Ltd",
 500        267: "Red Lion Controls, Inc",
 501        268: "Accurate Technologies",
 502        269: "Saft America Inc.,  Space & Defense Division",
 503        270: "Tennant",
 504        271: "Cole Hersee",
 505        272: "Gross Mechanical Laboratories, Inc",
 506        273: "Active Research Limited",
 507        274: "LTW Technology Co., LTD",
 508        275: "Navico Egersund AS",
 509        276: "Aqua-Hot Heating Systems",
 510        277: "LHP Telematics",
 511        278: "Takata Electronics",
 512        279: "Geometris LP",
 513        280: "Leica Geosystems Pty Ltd",
 514        281: "Precision Governors LLC",
 515        282: "Medallion Instrumentation Systems",
 516        283: "CWF Hamilton & Co Ltd",
 517        284: "Mobile Tech Chile",
 518        285: "Sea Recovery Corp",
 519        286: "Coelmo srl",
 520        287: "NTech Industries, Inc",
 521        288: "Mitsubishi FUSO Truck & Bus Corp.",
 522        289: "Watlow",
 523        290: "Kuebler GmbH",
 524        291: "Groeneveld Transport Efficiency BV",
 525        292: "IKUSI - Angel Iglesias S.A.",
 526        293: "Spyder Controls Corp.",
 527        294: "Grayhill Inc.",
 528        295: "BEP Marine",
 529        296: "micro dynamics GmbH",
 530        297: "Zonar Systems Inc",
 531        298: "Holley Performance",
 532        299: "Rauch",
 533        300: "Systron Donner Automotive",
 534        301: "Parker Hannifin (UK) Ltd FDE group",
 535        302: "Nissin Kogyo Co., LTD",
 536        303: "CTS Corporation",
 537        304: "EmpirBus AB",
 538        305: "NovAtel Inc",
 539        306: "Sleipner Motor AB",
 540        307: "MAS Technologies",
 541        308: "Cyntrx",
 542        309: "Krauss-Maffei Wegmann GmbH & Co. KG",
 543        310: "TECNORD srl",
 544        311: "Patrick Power Products",
 545        312: "Lectronix, Inc.",
 546        313: "Ilmor Engineering, Inc.",
 547        314: "CSM GmbH",
 548        315: "Icom Incorporated",
 549        316: "ITT Flow Control",
 550        317: "Navtronics Bvba",
 551        318: "SAT Plan",
 552        319: "Cadec Global",
 553        320: "Miedema Landbouwwerktuigenfabriek B.V.",
 554        321: "Ultra Electronics, Electrics",
 555        322: "MICHENKA s.r.o.",
 556        323: "Mobileye Vision Technologies Ltd.",
 557        324: "Snap-on Diagnostics",
 558        325: "ASM Automation Sensorik Messtechnik GmbH",
 559        326: "Akron Brass Company",
 560        327: "Sonceboz SA",
 561        328: "Qwerty Electronik AB",
 562        329: "Deif A/S",
 563        330: "Kidde Aerospace and Defense",
 564        331: "Horton, Inc.",
 565        332: "HWH Corporation",
 566        333: "Hadley Products Corporation",
 567        334: "Takata-Petri AG",
 568        335: "Evo Electric Ltd",
 569        336: "APE s.r.o.",
 570        337: "Carraro S.p.A.",
 571        338: "GRAF-SYTECO",
 572        339: "Competence Center ISOBUS e.V.",
 573        340: "Continental AG",
 574        341: "Boning GmbH & Co",
 575        342: "THOMAS MAGNETE GmbH",
 576        343: "Baumer Group",
 577        344: "Parvus Corporation",
 578        345: "Korean Maritime University",
 579        346: "Control Solutions",
 580        347: "Honeywell",
 581        348: "Amazonen Werke H. Dreyer",
 582        349: "Suonentieto",
 583        350: "Noris Marine Systems GmbH & Co KG",
 584        351: "Thrane & Thrane",
 585        352: "SAME DEUTZ-FAHR GROUP S.p.A.",
 586        353: "Hegemon Electronics, Inc.",
 587        354: "Junkkari OY",
 588        355: "Mastervolt International B.V.",
 589        356: "Fischer Panda Generators, Inc",
 590        357: "Hardi International A/S",
 591        358: "Victron Energy B.V.",
 592        359: "Ludwig Bergmann GmbH",
 593        360: "HJS Emission Technology GmbH & Co KG   (formerly HJS Fahrzeugtechnik GmbH & Co KG)",
 594        361: "InMach",
 595        362: "Poettinger Landtechnik GmbH (formerly Alois Poettinger Maschinenfabrik GmbH)",
 596        363: "BEI Duncan",
 597        364: "OEM Controls Inc.",
 598        365: "Digi-Star, LLC",
 599        366: "Viewnyx Corp.",
 600        367: "Fliegl Agrartechnik",
 601        368: "HANSENHOF_electronic",
 602        369: "Power Torque Engineering Ltd",
 603        370: "Rolls-Royce Marine AS",
 604        371: "Heinzmann GmbH & Co. KG",
 605        372: "Delphi",
 606        373: "Electronic Design Inc.",
 607        374: "Northern Lights, Inc.",
 608        375: "Williams Controls Inc.",
 609        376: "Quake Global",
 610        377: "ifm electronic gmbh",
 611        378: "Glendinning Marine Products",
 612        379: "Yamabiko Corporation",
 613        380: "Suntech International Ltd.",
 614        381: "B & G",
 615        382: "National Agriculture and Food Research Organization",
 616        383: "MCL Industries",
 617        384: "Camano Light",
 618        385: "Johnson Outdoor Marine Electronics",
 619        386: "JLG Automation BVBA",
 620        387: "Orscheln Products, LLC",
 621        388: "Innomatix, LLC",
 622        389: "Benchmark Electronics, Minnesota Division",
 623        390: "Partech Inc.",
 624        391: "Electronic Design for Industry, Inc",
 625        392: "Tianyuan Technology Co Ltd.",
 626        393: "Harvest Tec, Inc",
 627        394: "Capi 2 Nederland B.V.",
 628        395: "GENTEC S.R.L.",
 629        396: "Beyond Measure",
 630        397: "Sanyo-kiki Co Ltd.",
 631        398: "Hilite International",
 632        399: "ISEKI & Co., Ltd.",
 633        400: "Livorsi Marine",
 634        401: "Torqeedo GmbH",
 635        402: "Simma Software, Inc.",
 636        403: "Trackwell ADS, Inc.",
 637        404: "Com Nav Marine Ltd",
 638        405: "Wema System AS",
 639        406: "Vecima Networks Inc.",
 640        407: "Comtech Mobile Datacom",
 641        408: "Corvus Energy Ltd.",
 642        409: "Transfluid S.r.L.",
 643        410: "COBO S.p.A. Divisione 3B6",
 644        411: "Hy-Drive Technologies Ltd.",
 645        412: "WebTech Wireless Inc.",
 646        413: "Datapross Nijbroek bv",
 647        414: "Cattron Group International",
 648        415: "Valid Manufacturing Ltd.",
 649        416: "Kubota Corporation",
 650        417: "KZValve",
 651        418: "Intellistick Inc",
 652        419: "Fusion Electronics Ltd",
 653        420: "Vermeer Corporation, ACS Group",
 654        421: "Vertex Standard Co, Ltd",
 655        422: "True Heading AB",
 656        423: "BSM Wireless, Inc.",
 657        424: "Odyne LLC",
 658        425: "Methode Electronics Inc, MDI",
 659        429: "Rota Engineering Ltd.",
 660        430: "Auteq Telematica S.A.",
 661        431: "Tohatsu Corporation",
 662        432: "S&A Systems, Inc.",
 663        433: "Rowe Electronics",
 664        434: "Stored Energy Systems",
 665        435: "Zunhammer GmbH",
 666        436: "Kinze Manufacturing",
 667        437: "Digital Yacht Limited",
 668        438: "Comar Systems Ltd",
 669        439: "Hyundai Heavy Industries",
 670        440: "Cummins Power Generation",
 671        441: "PTG Reifendruckregelsysteme GmbH",
 672        442: "Horsch Maschinen GmbH",
 673        443: "SignalQuest, Inc.",
 674        444: "ITT Power Solutions",
 675        445: "KAT MECHATRONIC, Electronic Product Division",
 676        446: "CertTech, L.L.C.",
 677        447: "Great Plains Mfg.",
 678        448: "Stanadyne Corporation, Electronics Systems",
 679        449: "Polaris Industries Inc",
 680        450: "Dycor Technologies Ltd.",
 681        451: "Parker Hannifin Corp",
 682        452: "WIKA Alexander Wiegand SE & Co. KG",
 683        453: "Cooper Bussmann",
 684        454: "NGK Spark Plug Co. Ltd",
 685        455: "ADZ NAGANO GmbH",
 686        456: "General Kinetics",
 687        457: "RUSELPROM-ElectricDrive Ltd",
 688        458: "Control Solutions, Inc.",
 689        459: "Alltek Marine Electronics Corp",
 690        460: "San Giorgio S.E.I.N.",
 691        461: "HAWE Hydraulik SE",
 692        462: "IHI Shibaura Machinery Corporation",
 693        463: "PROBOTIQ",
 694        464: "Leach International Corporation",
 695        465: "Ashcroft Inc",
 696        466: "Veethree Electronics and Marine LLC",
 697        467: "Lely Industries N.V.",
 698        468: "Tyco Fire Protection Products",
 699        469: "RA Consulting GmbH",
 700        470: "SI-TEX Marine Electronics",
 701        471: "Sea Cross Marine AB",
 702        472: "Tenneco Inc.",
 703        473: "Boss Industries, Inc.",
 704        474: "Persen Technologies Inc.",
 705        475: "GME",
 706        476: "Hummingbird Marine Electronics",
 707        477: "OilQuick AB",
 708        478: "OceanSat B.V.",
 709        479: "Vapor Bus International",
 710        480: "EnerDel, Inc.",
 711        481: "Chetco Digital Instruments",
 712        482: "Tricon Electronics",
 713        483: "Valeo",
 714        484: "Headsight Inc.",
 715        485: "MATT automotive",
 716        486: "Westport Innovations Inc.",
 717        487: "DSE Test Solutions A/S",
 718        488: "The Charles Machine Works, Inc.",
 719        489: "Appareo Systems, LLC",
 720        490: "QuikQ",
 721        491: "Penny and Giles Ltd",
 722        492: "Inergy Automotive Systems",
 723        493: "Watcheye",
 724        494: "Synerject",
 725        495: "HOLMER Maschinenbau GmbH",
 726        496: "W. Gessmann GmbH",
 727        497: "SENTRON Sistemas Embarcados",
 728        498: "Innovative Design Solutions, Inc.",
 729        499: "LCJ Capteurs",
 730        500: "Oxbo International Corporation",
 731        501: "Agrotronix S.A.",
 732        502: "Attwood Corporation",
 733        503: "Naviop S.R.L.",
 734        504: "Vesper Marine",
 735        505: "Yetter Farm Equipment",
 736        506: "IHI STAR Machinery Corporation",
 737        507: "ISOBUS Test Center",
 738        508: "Transtech Innovations",
 739        509: "MOTORTECH GmbH",
 740        510: "Marinesoft Co. Ltd",
 741        511: "Sulky",
 742        512: "Inpower LLC",
 743        513: "FarmscanAg",
 744        514: "DISTek Integration, Inc.",
 745        515: "GINAF Trucks Nederland B.V.",
 746        516: "AVAT Automation GmbH",
 747        517: "Noland Engineering",
 748        518: "Transas USA Inc.",
 749        519: "Peeters Landbouwmachines b.v.",
 750        520: "Trapeze",
 751        521: "Clever Devices Ltd.",
 752        522: "Nebraska Tractor Test Laboratory",
 753        523: "Reggio Emilia Innovazione",
 754        524: "Vomax Instrumentation Pty. Ltd.",
 755        525: "Rust Sales INC",
 756        526: "LOFA Industries, Inc",
 757        527: "GKN Walterscheid GmbH",
 758        528: "Hoganas AB, Electric Drive Systems",
 759        529: "National Instruments Korea",
 760        530: "NMEA",
 761        531: "Genge & Thoma AG",
 762        532: "Onwa Marine Electronics Co Ltd.",
 763        533: "Doran Manufacturing, LLC",
 764        534: "Webasto Thermo & Comfort SE",
 765        535: "MOTORPAL, a.s.",
 766        536: "SSI Technologies",
 767        537: "Schrader Electronics Ltd.",
 768        538: "Crop Ventures, Inc.",
 769        539: "Mobileview",
 770        540: "Dinex A/S",
 771        541: "Total Fire Systems, Inc.",
 772        542: "Dinamica Generale s.p.a.",
 773        543: "BAUER Maschinen GmbH",
 774        544: "Au Group Electronics",
 775        545: "GS Hydraulics",
 776        546: "Maruyama Mfg Co, Inc.",
 777        547: "Thomson Linear LLC",
 778        548: "TM4 Inc.",
 779        549: "ROAD Deutschland GmbH",
 780        550: "SUN-A Corporation",
 781        551: "Wexler CSD Ltd.",
 782        552: "Matsuyama Plow Mfg Co, Ltd",
 783        553: "KIB Electronics",
 784        554: "iris-GmbH infrared & intelligent sensors",
 785        555: "Sasaki Corporation",
 786        556: "Doosan Infracore Norway",
 787        557: "Rockson Automation GmbH",
 788        558: "Davis Instruments Corp.",
 789        559: "Four Peaks Navigation",
 790        560: "Iowa State University, Agricultural and Biosystems Engineering",
 791        561: "b-plus GmbH",
 792        562: "Bombardier Transportation GmbH",
 793        563: "LOHR Sistemas Eletronicos LTDA",
 794        564: "Auto Power Electronic",
 795        565: "Micro-Trak Systems, Inc.",
 796        566: "Geode Technology, Inc.",
 797        567: "Lithiumstart LLC",
 798        568: "Makersan Ltd. Co.",
 799        569: "LORD MicroStrain Sensing Systems",
 800        570: "frenzel + berg electronic GmbH & Co. KG",
 801        571: "Marinecraft Co., Ltd.",
 802        572: "Fasse Valves",
 803        573: "Orolia Ltd",
 804        574: "Vishay Precision Group",
 805        575: "Lytx",
 806        576: "Vectia",
 807        577: "Denchi Power Ltd  (formerly ABSL Power Solutions Limited)",
 808        578: "advanSea",
 809        579: "KVH Industries, Inc.",
 810        580: "San Jose Technology, Inc.",
 811        581: "Väderstad - Verken AB",
 812        582: "Innovative Software Engineering",
 813        583: "Yachtcontrol",
 814        584: "CarMedialab GmbH",
 815        585: "Industrial Electronic Controls",
 816        586: "Suzuki Motor Corp",
 817        587: "JCA Electronics",
 818        588: "Vignal Systems",
 819        589: "MICO, Inc.",
 820        590: "ARGO-HYTOS GMBH",
 821        591: "United States Coast Guard",
 822        592: "tecsis GmbH",
 823        593: "Sensata Technologies",
 824        594: "Kongsberg Automotive",
 825        595: "CustomWare",
 826        596: "Brunelco Electronic Innovators B.V.",
 827        597: "Hydac Filter Systems GmbH",
 828        598: "ABB Turbo Systems Ltd",
 829        599: "Spudnik Equipment Co, LLC",
 830        600: "Aquatic AV",
 831        601: "Navitas Systems",
 832        602: "Nomad Digital Ltd.",
 833        603: "Kereval",
 834        604: "Indexator Rototilt Systems AB",
 835        605: "Aventics GmbH",
 836        606: "Intellian Technologies",
 837        607: "Knappco/Civacon",
 838        608: "Gale Banks Engineering",
 839        609: "Walvoil S.p.A.",
 840        610: "Trail Tech",
 841        611: "Esterline",
 842        612: "Samwon IT",
 843        613: "HKS Co., Ltd.",
 844        614: "ARLT Technologies GmbH",
 845        615: "Networkfleet, Verizon Telematics",
 846        616: "SMART-TEC s.r.o.",
 847        617: "Zero Emission Vehicles",
 848        618: "Evrard SA",
 849        619: "Right Weigh Load Scales",
 850        620: "Sevcon Ltd.",
 851        621: "Hagie Manufacturing Company",
 852        622: "Floyd Bell Inc",
 853        623: "Xirgo Technologies",
 854        624: "Blackbox Machine Control Pty Ltd",
 855        625: "Global MRV Inc.",
 856        626: "AVL DiTEST GmbH",
 857        627: "Radio Ocean",
 858        628: "Falck Schmidt Defence Systems",
 859        629: "Agri Info Design, Ltd.",
 860        630: "SmartDrive Systems Inc.",
 861        631: "Reltima",
 862        632: "Pepperl+Fuchs GmbH",
 863        633: "TORC Robotics",
 864        634: "Rocky Research",
 865        635: "Argo Tractors S.p.A.",
 866        636: "Divelbiss Corporation",
 867        637: "Bavaria Yachtbau GmbH",
 868        638: "KVH Industries, Inc.",
 869        639: "Startec s.r.l.",
 870        640: "Power Solutions International",
 871        641: "Diverse Yacht Services",
 872        642: "Moog / Aspen Motion Technologies",
 873        643: "Bogballe A/S",
 874        644: "KUS USA",
 875        645: "esd electronic system design gmbh",
 876        646: "Veenhuis Machines B.V.",
 877        647: "Siloking",
 878        648: "OJSC Ekran",
 879        649: "Control-Q B.V.",
 880        650: "Seiko Epson Corp.",
 881        651: "Takakita Co, Ltd.",
 882        652: "MicroControl GmbH & Co. KG",
 883        653: "AEV, spol. s r. o.",
 884        654: "Kohler Power Systems, Detroit Engine Development Center (DEDC)",
 885        655: "Genge & Thoma AG",
 886        656: "PRO SOLUS do Brasil",
 887        657: "Terzo Power Systems",
 888        658: "Shenzhen Jiuzhou Himunication Technology Co., Ltd",
 889        659: "Data Panel Corp.",
 890        660: "Auto-Gaz Centrum",
 891        661: "SPAL Automotive S.r.l.",
 892        662: "Kissling Elektrotechnik GmbH",
 893        663: "Delta Systems, Inc",
 894        664: "Level Developments Ltd",
 895        665: "Gebr. Bode GmbH & Co. KG",
 896        666: "Schaeffler Technologies AG & Co., KG",
 897        667: "Bartec",
 898        668: "MacDon Industries Ltd.",
 899        669: "Quantum Fuel Systems Technologies Worldwide, Inc",
 900        670: "STEMCO LP",
 901        671: "Innovative Controls Inc.",
 902        672: "OPTIMA Concept",
 903        673: "Caruelle Nicolas",
 904        674: "Yara International ASA",
 905        675: "Kawasaki Motors Corp., USA",
 906        676: "Danfoss IXA A/S",
 907        677: "DSA Daten- und Systemtechnik GmbH",
 908        678: "KeepTruckin, Inc.",
 909        679: "Cimco Marine AB",
 910        680: "AMVAC Chemical Corporation",
 911        681: "BEDIA Motorentechnik GmbH & Co. KG",
 912        682: "Eckelmann AG",
 913        683: "Fosen Elektro",
 914        684: "KEB",
 915        685: "ANEDO Ltd.",
 916        686: "Taigene Electric Machinery Corp.",
 917        687: "Flight Systems, Inc.",
 918        688: "Rockford Corp",
 919        689: "Aarcomm Systems Inc",
 920        690: "LINAK A/S",
 921        691: "Digitroll Agricultural Electronics",
 922        692: "Tanhay Corporation",
 923        693: "Agility Fuel Solutions (formerly Agility Fuel Systems)",
 924        694: "GasTOPS Ltd.",
 925        695: "Weldon Technologies",
 926        696: "DRS Network & Imaging Systems, LLC (DRS Technologies)",
 927        697: "Ålö AB",
 928        698: "Scorpion Technologies Ltd.",
 929        699: "Harman International Industries",
 930        700: "K-Tec Earthmovers Inc.",
 931        701: "BigRoad Inc.",
 932        702: "Weichai Power Co., Ltd.",
 933        703: "Hydro Tab Marine Engineering",
 934        704: "JL Audio, Inc.",
 935        705: "SVAB Hydraulik AB",
 936        706: "Shanghai Diesel Engine Corporation Limited",
 937        707: "Rochester Gauges Inc",
 938        708: "Lars Thrane A/S",
 939        709: "Marquardt GmbH",
 940        710: "Greentronics Ltd.",
 941        711: "DAS Co., LTD",
 942        712: "LOR Manufacturing Company Inc.",
 943        713: "US Hybrid Corporation",
 944        714: "Kobashi Kogyo Co., Ltd.",
 945        715: "Autonnic Research Ltd",
 946        716: "Eaton Control & Power Conversion Division (CPCD)",
 947        717: "Yacht Devices Ltd",
 948        718: "Micronet Inc",
 949        719: "Cojali S. L.",
 950        720: "WITZ Corporation",
 951        721: "Hypro",
 952        722: "Contelec AG",
 953        723: "Jabil Inc.",
 954        724: "Electronic Applications, Inc.",
 955        725: "Hitachi Construction Machinery Co., Ltd.",
 956        726: "MIDORI PRECISIONS",
 957        727: "Dhoot Transmission Pvt Ltd.",
 958        728: "Streumaster / Panien",
 959        729: "Liebherr",
 960        730: "BERTHOUD AGRICOLE",
 961        731: "Modine Manufacturing Company",
 962        732: "Gefran S.p.A.",
 963        733: "Intendia S.L.",
 964        734: "REAPsystems",
 965        735: "AEM Performance Electronics",
 966        736: "Terex Aerial Work Platforms - Genie",
 967        737: "Balluff GmbH",
 968        738: "Blue Ink Technologies",
 969        739: "LXNAV d.o.o.",
 970        740: "e-Traction",
 971        741: "Carling Technologies",
 972        742: "EROAD",
 973        743: "Daemyung Elevator Co., Ltd.",
 974        744: "Woosung Engineering Co., Ltd.",
 975        745: "Cidra Corporate Services Inc.",
 976        746: "SureFire Ag Systems, Inc.",
 977        747: "Agratronix",
 978        748: "ISOTTA",
 979        749: "Chart Inc.",
 980        750: "Joskin SA",
 981        751: "Pacific Track",
 982        752: "Deep Sea Electronics Plc",
 983        753: "AIROD Technologies",
 984        754: "Parker Hannifin Corp., Automation Group",
 985        755: "Firefly Integrations",
 986        756: "Maschio Gaspardo S.P.A.",
 987        757: "IMPCO Technologies",
 988        758: "Banner Engineering Corp.",
 989        759: "Hydro-Gear",
 990        760: "Bernecker + Rainer Industrie Elektronik GmbH",
 991        761: "MITA OLEODINAMICA S.p.A.",
 992        762: "ROJ s.r.l.",
 993        763: "AT-Systems BVBA",
 994        764: "Bednar FMT s.r.o.",
 995        765: "GIGAVAC",
 996        766: "Epec Oy",
 997        767: "Alliance Wireless Technologies Inc.",
 998        768: "Flores Automation, LLC",
 999        769: "Trombetta",
1000        770: "MONOSEM",
1001        771: "Shaw Development, LLC",
1002        772: "Blink Marine",
1003        773: "Clarion Corporation of America",
1004        774: "Taisho Corporation",
1005        775: "ZIEHL-ABEGG Automotive GmbH",
1006        776: "HMI Systems LLC",
1007        777: "Ocean Signal Ltd",
1008        778: "Seakeeper Inc.",
1009        779: "RLC Electronic Systems",
1010        780: "AVID Technology Ltd",
1011        781: "Poly-Planar LLC",
1012        782: "AVR bvba",
1013        783: "Loup Electronics Inc.",
1014        784: "CM Automotive Systems, Inc.",
1015        785: "Fischer Panda GmbH",
1016        786: "Johnson Matthey Battery Systems",
1017        787: "Abertax Technologies Limited",
1018        788: "MoTeC Pty Ltd",
1019        789: "GRADALL",
1020        790: "VACALL",
1021        791: "AUTEC",
1022        792: "Kostal Mexicana",
1023        793: "James Fisher Prolec",
1024        794: "Shihlin Electric & Engineering Corporation",
1025        795: "Broyda Enterprises Pty Ltd",
1026        796: "Canadian Automotive Industries Ltd",
1027        797: "Tides Marine",
1028        798: "Lumishore Ltd",
1029        799: "Stillwater Designs and Audio, Inc. - KICKER",
1030        800: "Delta-Q Technologies",
1031        801: "LOR Manufacturing Company Inc.",
1032        802: "SPBI (Bj Technologie)",
1033        803: "Gill Sensors & Controls Limited",
1034        804: "ASA Electronics",
1035        805: "Gundersen & Løken AS",
1036        806: "Charge Automotive Ltd",
1037        807: "Schneider-Electric",
1038        808: "RIMEX Supply Ltd.",
1039        809: "HMS Industrial Networks AB",
1040        810: "Dutch Power Company",
1041        811: "Blue Water Desalination",
1042        812: "Torch Technologies",
1043        813: "Thales Suisse SA",
1044        814: "Soltec Soluzioni Tecnologiche Srl",
1045        815: "FLIR Systems, Inc.",
1046        816: "UniStrong",
1047        817: "TE Connectivity Sensor Solutions",
1048        818: "HGNSS",
1049        819: "Preco Electronics",
1050        820: "DIaLOGIKa Gesellschaft fuer angewandte Informatik mbH",
1051        821: "Thorsen Teknik A/S",
1052        822: "Bren-Tronics, Inc.",
1053        823: "ACEINNA, Inc (formerly MEMSIC, Inc)",
1054        824: "Undheim Systems AS",
1055        825: "BPW Hungária",
1056        826: "Lewmar Marine Inc",
1057        827: "INmatix Technology Group Ltd",
1058        828: "AgriBrink Inc.",
1059        829: "Drov Technologies, Inc.",
1060        830: "Ultra Motion LLC",
1061        831: "DOK-ING Ltd.",
1062        832: "Heizomat Gerätebau-Energiesysteme GmbH",
1063        833: "Electrum Automation AB",
1064        834: "Pioneer Microsystems, Inc.",
1065        835: "PetTrack Ltd.",
1066        836: "Signature4",
1067        837: "Famic Technologies Inc.",
1068        838: "Teamsurv Ltd",
1069        839: "Indexator Rotator Systems AB",
1070        840: "E.S.T.E. srl",
1071        841: "Agra-GPS",
1072        842: "DigiDevice Srl",
1073        843: "Hendrickson Truck Commercial Vehicle Systems",
1074        844: "FELL AS",
1075        845: "GMB Güstrower Maschinenbau GmbH",
1076        846: "L3 Magnet-Motor",
1077        847: "Oceanvolt",
1078        848: "ningupex",
1079        849: "MTS Maschinentechnik Schrode AG",
1080        850: "Geoprospectors GmbH",
1081        851: "Novotechnik Messwertaufnehmer OHG",
1082        852: "Velvac Inc",
1083        853: "Teledyne RESON B.V.",
1084        854: "GEMAC Chemnitz GmbH",
1085        855: "Toshiba Infrastructure Systems & Solutions Corporation",
1086        856: "FarmFacts GmbH",
1087        857: "Zoomlion Heavy Industry NA, Inc",
1088        858: "Littelfuse",
1089        859: "Valor",
1090        860: "Michelin",
1091        861: "Adel System S.r.l.",
1092        862: "Prospec Electronics",
1093        863: "SMAG",
1094        864: "Streamline Transportation Technologies Inc.",
1095        865: "MyEasyFarm",
1096        866: "Netradyne, Inc.",
1097        867: "Skeleton Technologies",
1098        868: "Data Panel Corp",
1099        869: "Intercomp",
1100        870: "Textron Fleet Management",
1101        871: "Superior Tech Inc",
1102        872: "Kählig Antriebstechnik GmbH",
1103        873: "Garnet Instruments Ltd.",
1104        874: "MTA S.p.A.",
1105        875: "Salvarani S.r.l.",
1106        876: "SUCO Robert Scheuffele GmbH & Co. KG",
1107        877: "SICK ATech GmbH",
1108        878: "FOTON",
1109        879: "PG Trionic, Inc.",
1110        880: "Revision Military",
1111        881: "Sovema",
1112        882: "BHTronik GmbH & Co. KG",
1113        883: "Swift Navigation, Inc.",
1114        884: "Sure Grip Controls Inc.",
1115        885: "SICK Stegmann GmbH",
1116        886: "Hitachi Zosen Corporation",
1117        887: "Hyperdrive Innovation Limited",
1118        888: "Carma Systems Inc",
1119        889: "SANY America Inc",
1120        890: "L3 Technologies, Inc.",
1121        891: "CarrierWeb",
1122        892: "Mectronx Corp",
1123        893: "KlinkTechnics Ltd.",
1124        894: "Rhodan Marine Systems of Florida LLC",
1125        895: "Peloton Technology",
1126        896: "NextFour Solutions Ltd",
1127        897: "Dot Technology Corp.",
1128        898: "Josef Kotte Landtechnik GmbH & Co. KG",
1129        899: "Lippert Components, Inc",
1130        900: "OSB AG",
1131        901: "Zivan Srl",
1132        902: "Bucher Hydraulics",
1133        903: "InMotion",
1134        904: "Equipment Safety Systems Pty. Ltd. (EQSS)",
1135        905: "ASA Electronics",
1136        906: "MOBA AG",
1137        907: "strautmann",
1138        908: "Chonbuk National University Department of Electronics",
1139        909: "Marines Co., Ltd.",
1140        910: "Hermann Paus Maschinenfabrik GmbH",
1141        911: "Nautic-On",
1142        912: "Steyr Motors GmbH",
1143        913: "Toyota Motor Corporation",
1144        914: "ZETOR TRACTORS a.s.",
1145        915: "Dosificacion y sistemas electronicos S.L. (DSE)",
1146        916: "Turck Inc.",
1147        917: "Sentinel d.o.o.",
1148        918: "AMW Machine Control, Inc",
1149        919: "Furrion LLC",
1150        920: "MTD Consumer Group Inc.",
1151        921: "ROPA Fahrzeug- und Maschinenbau GmbH",
1152        922: "Terberg Benschop B.V.",
1153        923: "ELTEK S.p.A.",
1154        924: "PAS Peschak Autonome Systeme GmbH",
1155        925: "GW Lisk Company",
1156        926: "Buhler Industries Inc.",
1157        927: "Saicon",
1158        928: "EAO Automotive GmbH & Co. KG",
1159        929: "Jl Marine Systems, Inc.",
1160        930: "Ecotronix Corp.",
1161        931: "Enertec Marine Ltd",
1162        932: "Discover Battery",
1163        933: "Delta Mobile Systems, Inc.",
1164        934: "Farmobile, Inc.",
1165        935: "Meels GmbH & Co. KG",
1166        936: "Hi-tech Millennium",
1167        937: "Precision Circuits Inc",
1168        938: "LEVEL Systems",
1169        939: "Warn Industries, Inc.",
1170        940: "Dometal Oy",
1171        941: "Navya",
1172        942: "Vogelsang GmbH & Co. KG",
1173        943: "FISCHER AG Präzisionspindeln",
1174        944: "ZONTISA Marine SL",
1175        945: "Equalizer AG",
1176        946: "Hydac Tecnologia Ltda",
1177        947: "Gerd Bär GmbH",
1178        948: "Donix",
1179        949: "Škoda Electric",
1180        950: "Reserved",
1181        1850: "Seastar Solutions (formerly Teleflex)",
1182        1851: "RayMarine",
1183        1852: "Navionics",
1184        1853: "Japan Radio Co",
1185        1854: "Northstar Technologies",
1186        1855: "Furuno USA",
1187        1856: "Trimble",
1188        1857: "Simrad",
1189        1858: "Litton",
1190        1859: "Kvasar AB",
1191        1860: "MMP",
1192        1861: "Vector North America (formerly Vector Cantech)",
1193        1862: "Sanshin",
1194        1863: "Thomas G. Faria Co.",
1195        1864: "Reserved",
1196    }
1197)
1198
1199# DM1 / DM2
1200lamp = generate_map(["Lamp Off", "Lamp On"])
1201flash = generate_map(["Slow Flash (1Hz)", "Fast Flash (2Hz+)", "Reserved", "Unavailable / No Flash"])
1202
1203# DM15
1204dm15_status = generate_map(
1205    {
1206        0: "Proceed",
1207        1: "Busy",
1208        2: "Reserved",
1209        4: "Operation Completed",
1210        5: "Operation Failed",
1211        6: "Reserved",
1212    }
1213)
1214dm15_seed = generate_map(
1215    {
1216        0: "Seed Completed – begin sending key",
1217        1: "Use Long Seed or Key from Data Security Message",
1218        2: "Seed Values",
1219        0xFFFF: "No Further Key required of Tool",
1220    }
1221)
1222
1223# PropB_D2
1224battery_mode = generate_map(
1225    ["Initialize", "Operational", "Dormant", "Protected", "Maintenance", "Manufacturer", "Error", "N/A"]
1226)
1227fet_array_control_states = generate_map(
1228    ["Low Power OFF", "No Charge", "No Charge No Discharge", "All On", "Maintenance", "Reserved", "Error", "N/A"]
1229)
1230soc_mode = generate_map(["Init", "No Current", "Coulomb Counting", "Unknown", "Reserved", "Reserved", "Error", "N/A"])
1231fast_overload_detection = generate_map(["No Overload Detected", "Overload Detected", "Error", "N/A"])
1232overload_latch_status = generate_map(["Unlatched", "Latched", "Error", "N/A"])
1233charge_overload_detection = generate_map(["No Charge Overload", "Charge Overload", "Error", "N/A"])
1234overload_latch_clear = generate_map(["No Clear Attempted", "Clear Latch Attempted", "Error", "N/A"])
1235heater_control = generate_map(["Off", "On", "Error", "N/A"])
1236charge_fet = generate_map(["Off", "On", "Error", "N/A"])
1237discharge_fet = generate_map(["Off", "On", "Error", "N/A"])
1238too_cold_to_charge = generate_map(["Charging Temp Reached", "Too Cold for Charge", "Error", "N/A"])
1239charge_volts = generate_map(["No Charge Voltage", "Charge Voltage", "Error", "N/A"])
1240overcharge_protect_latch = generate_map(["Not Latched", "Latched", "Error", "N/A"])
1241ideal_diode = generate_map(["Bypass", "On", "Error", "N/A"])
1242fet_power = generate_map(["FET Power Off", "FET Power On", "Error", "N/A"])
1243heat_reasons = generate_map(
1244    {
1245        0: "Init",
1246        1: "FETs Opening",
1247        2: "Master Power Off",
1248        3: "Manufacturer Heating",
1249        4: "Not in Operational Mode",
1250        5: "Heating Disabled",
1251        6: "Normal Heating",
1252        7: "Too Hot",
1253        8: "Reserved",
1254        14: "Error",
1255        15: "N/A",
1256    }
1257)
1258long_term_fault_log = generate_map(
1259    {
1260        0: "Logging Normally",
1261        1: "Not Initialized",
1262        2: "No Media Detected",
1263        3: "Unable to Initialize Media",
1264        4: "Media Write Protected",
1265        5: "Unable to Initialize Filesystem",
1266        6: "No Filesystem Detected",
1267        7: "Unable to Mount Filesystem",
1268        8: "Error Opening File",
1269        9: "Error Creating File",
1270        10: "Reserved",
1271        14: "Error",
1272        15: "N/A",
1273    }
1274)
1275
1276# PropB_D6
1277current_range = generate_map(["Low", "High", "Error", "N/A"])
1278
1279# PropB_D8
1280balancing_status = generate_map(["Off", "On (Discharging)", "Error", "N/A"])
1281
1282# PropB_DE
1283bit_result = generate_map(["Pass", "Fail", "Error", "Not Yet Run / Not Available"])
1284
1285# PropB_E4
1286bit_id = generate_map(
1287    [
1288        "Reserved",
1289        "Overcharge – Severe",
1290        "Battery Voltage Calibration",
1291        "Current Calibration",
1292        "Pack Voltage Calibration",
1293        "Cell Voltage Sensor",
1294        "Balancing Subsystem Failure",
1295        "Memory Failure",
1296        "Other Subsystem Failure",
1297        "Battery Voltage Grounded",
1298        "Contactor Subsystem Failure",
1299        "Charger Subsystem Failure",
1300        "SOC below Reserve Limit",
1301        "Battery Voltage High – Severe",
1302        "Battery Voltage Low – Severe",
1303        "Battery Voltage High – Moderate",
1304        "Battery Voltage Low – Moderate",
1305        "Charge Current – Severe",
1306        "Discharge Current – Severe",
1307        "Charge Current – Moderate",
1308        "Discharge Current – Moderate",
1309        "Battery Temperature High – Severe",
1310        "Battery Temperature Low – Severe",
1311        "Battery Temperature High – Moderate",
1312        "Battery Temperature Low – Moderate",
1313        "Over-discharge – Severe",
1314        "Overcharge – Moderate",
1315        "Over-discharge – Moderate",
1316        "Internal Pack Voltage High – Severe",
1317        "Internal Pack Voltage Low – Severe",
1318        "Internal Pack Voltage High – Moderate",
1319        "Internal Pack Voltage Low – Moderate",
1320        "Cell Voltage High – Severe",
1321        "Cell Voltage Low – Severe",
1322        "Cell Voltage High – Moderate",
1323        "Cell Voltage Low – Moderate",
1324        "Battery Voltage Sensor",
1325        "Current Sensor",
1326        "Battery Temperature Sensor",
1327        "Battery Temperature Shorted High",
1328        "Battery Temperature Shorted Low",
1329        "SOC Data Out of Range",
1330        "Internal Pack Voltage Sensor",
1331        "Cell Voltage Communication Loss",
1332        "Heater Subsystem Failure",
1333        "Heater Stuck Off",
1334        "Heater Stuck On",
1335        "Contactor Stuck Open",
1336        "Contactor Stuck Closed",
1337        "Charge Path Open",
1338        "Charge Path Closed",
1339        "Balancing Failure Exists",
1340        "On-Board Voltage High – Minor",
1341        "On-Board Voltage Low – Minor",
1342        "Long-Term Log Not Storing Data",
1343        "Discharge Current – Minor",
1344        "Cell Voltage Low – Minor",
1345    ]
1346)
1347
1348# PropB_07
1349protected_state_warning = generate_map(
1350    [
1351        "Battery is in the Protected State",
1352        "Warning 1. Battery could transition to the Protected state within 1-2 seconds",
1353        "Warning 2. Battery could transition to the Protected state within 3-10 seconds",
1354        "Warning 3. Battery could transition to the Protected state within 11-30 seconds",
1355        "No warnings. Normal operation.",
1356        "Reserved",
1357        "Error",
1358        "N/A",
1359    ]
1360)
1361
1362# PropB_E9
1363table_id = generate_map(
1364    {
1365        0: "State of Health Calendar Data",
1366        1: "State of Health Depth-of￾Discharge Cycle Data",
1367        2: "Spare",
1368        251: "Reserved",
1369        254: "Error",
1370        255: "N/A",
1371    }
1372)
1373table_type = generate_map(
1374    {
1375        0: "2 16-bit Unsigned Ints",
1376        1: "32-bit Unsigned Int",
1377        2: "0.1%",
1378        3: "1°C",
1379        4: "0.1 Hours",
1380        5: "0.01%",
1381        6: "Spare",
1382        251: "Reserved",
1383        254: "Error",
1384        255: "N/A",
1385    }
1386)
1387
1388# Heartbeat
1389primary_can_interface = generate_map(["CAN B Primary Interface", "CAN A Primary Interface", "Error", "N/A"])
1390heartbeat_can_interface = generate_map(
1391    ["Primary and Secondary CAN Interface", "Primary CAN Interface Only", "Error", "N/A"]
1392)
1393can_status = generate_map(["CAN is not operational", "CAN is operational", "Error", "N/A"])
1394battery_status = generate_map(["Battery has normal function", "Battery has fault", "Error", "N/A"])
1395
1396failed_exit_attempts_count = generate_map(
1397    {
1398        0: "Count of the number of failed attempts",
1399        0xFB: "Count exceeded maximum",
1400        0xFC: "Reserved",
1401        0xFE: "Error",
1402        0xFF: "N/A",
1403    }
1404)
1405
1406# PropB_04
1407contact_state = generate_map(["Contactor(s) is open", "Contactor(s) is closed", "Error", "N/A"])
1408charge_capability_state = generate_map(
1409    ["Battery is unable to accept charge", "Battery is able to accept charge", "Error", "N/A"]
1410)
1411
1412protected_state_timeout = generate_map(
1413    {
1414        0: "Time in seconds before the attempt to exit the Protected State",
1415        0xFB00: "Battery requires “Reset Protection” command to exit Protected State",
1416        0xFB01: "No timeout for fault ",
1417        0xFDFF: "Reserved",
1418        0xFEFF: "Error",
1419        0xFFFF: "N/A",
1420    }
1421)
1422
1423load_indicator = generate_map(
1424    [
1425        "Provide or adjust charging potential on battery to exit Protected State.",
1426        "Remove load or short circuit from battery to exit Protected State.",
1427        "No load indicator for fault.",
1428        "N/A",
1429    ]
1430)
1431
1432# PropB_08
1433soc_reserve_limit = generate_map(
1434    {
1435        0x00: "% SOC limit",
1436        0xC9: "Reserved",
1437        0xFF: "N/A",
1438    }
1439)
1440
1441application_overcurrent_limit = generate_map(
1442    {
1443        0x00: "Reserved",
1444        0x05: "Amperes",
1445        0xDD: "Reserved",
1446        0xFB: "Disable System Overcurrent Limit",
1447        0xFC: "Reserved",
1448        0xFF: "N/A",
1449    }
1450)
1451
1452application_overcurrent_period = generate_map(
1453    {
1454        0x00: "Reserved",
1455        0x01: "Seconds",
1456        0xFB: "Reserved",
1457        0xFF: "N/A",
1458    }
1459)
1460
1461# PropB_DE
1462reset_pin_state = generate_map(["Reset pin floating (off)", "Reset pin shorted to COM (on)", "Reserved", "N/A"])
1463effective_reset_time = generate_map(
1464    {
1465        0: "Seconds Reset pin has been shorted to COM while physical "
1466        "Master Power Switch is On and Dormant pins are Off",
1467        61: "Reset pin has been shorted to com for more than 60 seconds.",
1468        62: "Reserved",
1469        63: "N/A",
1470    }
1471)
1472
1473# acknowledgement
1474acknowledgement = generate_map(
1475    [
1476        "Positive Acknowledgment",
1477        "Negative Acknowledgment",
1478        "PGN supported but security denied access",
1479        "PGN supported but ECU is busy and cannot respond now. Re-request the data at a later time.",
1480    ]
1481)
1482
1483# PropB_06
1484on_off_state = generate_map(["Off", "On", "Error", "N/A"])
1485maintenance_state = generate_map(
1486    ["Battery is not in the Maintenance State", "Battery is in the Maintenance State", "Error", "N/A"]
1487)
1488contactor_control_state = generate_map(["Not automatic (state forced by command)", "Automatic", "Error", "N/A"])
1489standby_state = generate_map(["Disabled", "Enabled", "Suspended by the Standby Suspend Period", "N/A"])
1490baud_rate_overide_state = generate_map(
1491    [
1492        "Has not been overwritten",
1493        "Has been overwritten",
1494        "Battery initialization is required to implement the baud rate change",
1495        "N/A",
1496    ]
1497)
1498position_identity_overwrite_state = generate_map(
1499    [
1500        "Has not been overwritten",
1501        "Has been overwritten",
1502        "Battery initialization is required to implement the position identity change",
1503        "N/A",
1504    ]
1505)
1506
1507# TP.CM
1508tpcm_control = generate_map(
1509    {
1510        0: "Reserved",
1511        16: "Destination Specific Request to Send (RTS)",
1512        17: "Destination Specific Clear to Send (CTS)",
1513        18: "Reserved",
1514        19: "End of Message Acknowledge",
1515        20: "Reserved",
1516        32: "Broadcast Announce Message",
1517        33: "Reserved",
1518        255: "Connection Abort",
1519    }
1520)
1521cts_packets = generate_map(
1522    {
1523        0: "",
1524        255: "No limit exists for the originator",
1525    }
1526)
1527sender_role = generate_map(
1528    ["Originating Controller Application", "Responding Controller Application", "Reserved", "Not specified"]
1529)
1530abortion_reason = generate_map(
1531    {
1532        0: "Reserved for SAE assignment",
1533        1: "Already in one or more connection managed sessions and cannot support another",
1534        2: "System resources were needed for another task, so this connection managed session was terminated",
1535        3: "A timeout occurred, and this is the connection abort to close the session",
1536        4: "CTS messages received when data transfer is in progress",
1537        5: "Maximum retransmit request limit reached",
1538        6: "Unexpected data transfer packet",
1539        7: "Bad sequence number (software cannot recover)",
1540        8: "Duplicate sequence number (software cannot recover)",
1541        9: "Total Message Size is greater than 1785 bytes",
1542        10: "Reserved for SAE assignment",
1543        250: "If a Connection Abort reason is identified that is not listed in the table use code 250",
1544        251: "Per SAE J1939-71 definitions",
1545    }
1546)
1547
1548# NM
1549name_error_code = generate_map(
1550    {
1551        0: "Security not satisfied. Different SA for Adopt Pending than Set Pending",
1552        1: "Item(s) not allowed to change. Qualifier flags of disallowed items are set to one",
1553        2: "Item conflict. Cannot perform Function assigned, cannot perform as Arbitrary Address capable, etc. "
1554        "Qualifier flags of disallowed items are set to one",
1555        3: "Checksum does not match",
1556        4: "Pending NAME not set",
1557        5: "Other",
1558        6: "Reserved",
1559        255: "Not Available",
1560    }
1561)
1562valid_flag = generate_map(["Valid", "Invalid"])
1563nm_control_mode = generate_map(
1564    {
1565        0: "Set Pending NAME",
1566        1: "Pending NAME Response",
1567        2: "Current NAME Response",
1568        3: "Set Pending NAME ACK",
1569        4: "Set Pending NAME NAK",
1570        5: "Request Pending NAME",
1571        6: "Request Current NAME",
1572        7: "Adopt Pend NAME",
1573        8: "Request Address Claim",
1574        9: "N/A",
1575    }
1576)
1577
1578# DM13
1579stop_start_cmd = generate_map(
1580    ["Stop broadcast", "Start broadcast", "Reserved", "Don’t care/take no action (leave as is)"]
1581)
1582
1583# DM14
1584pointer_type = generate_map(["Direct memory addressing", "Directed spatial addressing"])
1585pointer_extension = generate_map(
1586    {
1587        0: "SPN Space",
1588        1: "Reserved",
1589        128: "Proprietary",
1590    }
1591)
1592security_key = generate_map(
1593    {
1594        0: "Use long seed or key from data security message",
1595        1: "Key values",
1596        0xFFFF: "No key available ",
1597    }
1598)
1599memory_command = generate_map(
1600    {
1601        0: "Erase",
1602        1: "Read",
1603        2: "Write",
1604        3: "Status",
1605        4: "Operation Completed",
1606        5: "Operation Failed",
1607        6: "Boot Load",
1608        7: "EDCP Generation",
1609    }
1610)
1611# DM17
1612packet_length = generate_map({0: "Reserved", 1: "Single-packet", 8: "Reserved", 255: "Multi-packet"})
1613
1614# DM18
1615security_type = generate_map(
1616    {
1617        0: "Data is long seed",
1618        1: "Data is long key",
1619        2: "Data is session key",
1620        3: "Data is certificate",
1621        4: "Reserved",
1622    }
1623)
Stringify: TypeAlias = Callable[[int], str]
def bytes_map(value: int) -> str:
42def bytes_map(value: int) -> str:
43    """Format as hex."""
44    return f"0x{value:02X}"

Format as hex.

def ascii_map(value: int) -> str:
47def ascii_map(value: int) -> str:
48    """Format as an ascii string."""
49    length = max(ceil(value.bit_length() / 8), 1)
50    return value.to_bytes(length=length, byteorder="big").decode("ASCII")

Format as an ascii string.

def generate_map(mapping: dict[int, str] | str | list[str]):
53def generate_map(mapping: dict[int, str] | str | list[str]):
54    """
55    Create a function mapping integers to strings with support for ranges.
56
57    dict = Ranged mapping, for example{0: x, 4: y} == {0 to 3: x, 4: y}
58    str = all ints map to this string
59    list = Indexed mapping starting from 0, for example [w, x, y] == {0: w, 1: x, 2: y}
60    """
61
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
69
70    return mapping_func

Create a function mapping integers to strings with support for ranges.

dict = Ranged mapping, for example{0: x, 4: y} == {0 to 3: x, 4: y} str = all ints map to this string list = Indexed mapping starting from 0, for example [w, x, y] == {0: w, 1: x, 2: y}

def integer(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def bool_map(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def celsius(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def fahrenheit(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def seconds(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def minutes(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def hours(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def days(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def months(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def percent(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def ah(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def volts(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def amps(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def watts(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
class Address(enum.IntEnum):
 90class Address(IntEnum):
 91    """Some common addresses."""
 92
 93    FILE_SERVER_PRINTER = 248
 94    DIAGNOSTIC_TOOL_2 = 249
 95    DIAGNOSTIC_TOOL_1 = 250
 96    ON_BOARD_DATA_LOGGER = 251
 97    EXPERIMENTAL = 252
 98    OEM = 253
 99    NULL = 254
100    GLOBAL = 255

Some common addresses.

FILE_SERVER_PRINTER = <Address.FILE_SERVER_PRINTER: 248>
DIAGNOSTIC_TOOL_2 = <Address.DIAGNOSTIC_TOOL_2: 249>
DIAGNOSTIC_TOOL_1 = <Address.DIAGNOSTIC_TOOL_1: 250>
ON_BOARD_DATA_LOGGER = <Address.ON_BOARD_DATA_LOGGER: 251>
EXPERIMENTAL = <Address.EXPERIMENTAL: 252>
OEM = <Address.OEM: 253>
NULL = <Address.NULL: 254>
GLOBAL = <Address.GLOBAL: 255>
Inherited Members
enum.Enum
name
value
builtins.int
conjugate
bit_length
bit_count
to_bytes
from_bytes
as_integer_ratio
is_integer
real
imag
numerator
denominator
def addresses(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def industry_group(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def vehicle_system(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def function_id(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def manufacturer_id(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def lamp(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def flash(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def dm15_status(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def dm15_seed(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def battery_mode(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def fet_array_control_states(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def soc_mode(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def fast_overload_detection(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def overload_latch_status(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def charge_overload_detection(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def overload_latch_clear(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def heater_control(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def charge_fet(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def discharge_fet(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def too_cold_to_charge(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def charge_volts(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def overcharge_protect_latch(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def ideal_diode(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def fet_power(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def heat_reasons(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def long_term_fault_log(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def current_range(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def balancing_status(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def bit_result(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def bit_id(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def protected_state_warning(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def table_id(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def table_type(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def primary_can_interface(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def heartbeat_can_interface(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def can_status(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def battery_status(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def failed_exit_attempts_count(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def contact_state(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def charge_capability_state(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def protected_state_timeout(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def load_indicator(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def soc_reserve_limit(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def application_overcurrent_limit(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def application_overcurrent_period(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def reset_pin_state(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def effective_reset_time(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def acknowledgement(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def on_off_state(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def maintenance_state(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def contactor_control_state(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def standby_state(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def baud_rate_overide_state(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def position_identity_overwrite_state(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def tpcm_control(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def cts_packets(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def sender_role(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def abortion_reason(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def name_error_code(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def valid_flag(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def nm_control_mode(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def stop_start_cmd(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def pointer_type(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def pointer_extension(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def security_key(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def memory_command(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def packet_length(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""
def security_type(value: int) -> str:
62    def mapping_func(value: int) -> str:  # pylint: disable=inconsistent-return-statements
63        if isinstance(mapping, dict):
64            return list(mapping.values())[bisect.bisect_right(list(mapping.keys()), value) - 1]
65        if isinstance(mapping, str):
66            return mapping
67        if isinstance(mapping, list):
68            return mapping[value] if 0 <= value < len(mapping) else ""