mirror of
https://github.com/sunnypilot/sunnypilot.git
synced 2026-02-18 23:33:58 +08:00
68 lines
2.5 KiB
Python
68 lines
2.5 KiB
Python
import capnp
|
|
from typing import Any
|
|
|
|
from cereal import custom
|
|
from opendbc.car import structs
|
|
|
|
_FIELDS = '__dataclass_fields__' # copy of dataclasses._FIELDS
|
|
|
|
|
|
def is_dataclass(obj):
|
|
"""Similar to dataclasses.is_dataclass without instance type check checking"""
|
|
return hasattr(obj, _FIELDS)
|
|
|
|
|
|
def _asdictref_inner(obj) -> dict[str, Any] | Any:
|
|
if is_dataclass(obj):
|
|
ret = {}
|
|
for field in getattr(obj, _FIELDS): # similar to dataclasses.fields()
|
|
ret[field] = _asdictref_inner(getattr(obj, field))
|
|
return ret
|
|
elif isinstance(obj, (tuple, list)):
|
|
return type(obj)(_asdictref_inner(v) for v in obj)
|
|
else:
|
|
return obj
|
|
|
|
|
|
def asdictref(obj) -> dict[str, Any]:
|
|
"""
|
|
Similar to dataclasses.asdict without recursive type checking and copy.deepcopy
|
|
Note that the resulting dict will contain references to the original struct as a result
|
|
"""
|
|
if not is_dataclass(obj):
|
|
raise TypeError("asdictref() should be called on dataclass instances")
|
|
|
|
return _asdictref_inner(obj)
|
|
|
|
|
|
def convert_to_capnp(struct: structs.CarParamsSP | structs.CarStateSP) -> capnp.lib.capnp._DynamicStructBuilder:
|
|
struct_dict = asdictref(struct)
|
|
|
|
if isinstance(struct, structs.CarParamsSP):
|
|
struct_capnp = custom.CarParamsSP.new_message(**struct_dict)
|
|
elif isinstance(struct, structs.CarStateSP):
|
|
struct_capnp = custom.CarStateSP.new_message(**struct_dict)
|
|
else:
|
|
raise ValueError(f"Unsupported struct type: {type(struct)}")
|
|
|
|
return struct_capnp
|
|
|
|
|
|
def convert_carControlSP(struct: capnp.lib.capnp._DynamicStructReader) -> structs.CarControlSP:
|
|
# TODO: recursively handle any car struct as needed
|
|
def remove_deprecated(s: dict) -> dict:
|
|
return {k: v for k, v in s.items() if not k.endswith('DEPRECATED')}
|
|
|
|
struct_dict = struct.to_dict()
|
|
struct_dataclass = structs.CarControlSP(**remove_deprecated({k: v for k, v in struct_dict.items() if not isinstance(k, dict)}))
|
|
|
|
struct_dataclass.mads = structs.ModularAssistiveDrivingSystem(**remove_deprecated(struct_dict.get('mads', {})))
|
|
# struct_dataclass.params = [structs.CarControlSP.Param(**remove_deprecated(p)) for p in struct_dict.get('params', [])]
|
|
struct_dataclass.leadOne = structs.LeadData(**remove_deprecated(struct_dict.get('leadOne', {})))
|
|
struct_dataclass.leadTwo = structs.LeadData(**remove_deprecated(struct_dict.get('leadTwo', {})))
|
|
struct_dataclass.intelligentCruiseButtonManagement = structs.IntelligentCruiseButtonManagement(
|
|
**remove_deprecated(struct_dict.get('intelligentCruiseButtonManagement', {}))
|
|
)
|
|
|
|
return struct_dataclass
|