diff --git a/README.md b/README.md
index 4ade7b937f..74906943ba 100755
--- a/README.md
+++ b/README.md
@@ -77,6 +77,7 @@ Supported Cars
| Honda | CR-V 2015-16 | Touring | openpilot | 25mph1 | 12mph |
| Honda | CR-V 2017-21 | Honda Sensing | Stock | 0mph | 12mph |
| Honda | CR-V Hybrid 2017-2019 | Honda Sensing | Stock | 0mph | 12mph |
+| Honda | e 2020 | All | Stock | 0mph | 3mph |
| Honda | Fit 2018-19 | Honda Sensing | openpilot | 25mph1 | 12mph |
| Honda | HR-V 2019-20 | Honda Sensing | openpilot | 25mph1 | 12mph |
| Honda | Insight 2019-21 | All | Stock | 0mph | 3mph |
diff --git a/selfdrive/car/honda/carstate.py b/selfdrive/car/honda/carstate.py
index 423d7dfaad..e9766e0731 100644
--- a/selfdrive/car/honda/carstate.py
+++ b/selfdrive/car/honda/carstate.py
@@ -75,7 +75,7 @@ def get_can_signals(CP, gearbox_msg="GEARBOX"):
("SCM_BUTTONS", 25),
]
- if CP.carFingerprint in (CAR.CRV_HYBRID, CAR.CIVIC_BOSCH_DIESEL, CAR.ACURA_RDX_3G):
+ if CP.carFingerprint in (CAR.CRV_HYBRID, CAR.CIVIC_BOSCH_DIESEL, CAR.ACURA_RDX_3G, CAR.HONDA_E):
checks += [
(gearbox_msg, 50),
]
@@ -119,7 +119,7 @@ def get_can_signals(CP, gearbox_msg="GEARBOX"):
else:
checks += [("CRUISE_PARAMS", 50)]
- if CP.carFingerprint in (CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G):
+ if CP.carFingerprint in (CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G, CAR.HONDA_E):
signals += [("DRIVERS_DOOR_OPEN", "SCM_FEEDBACK", 1)]
elif CP.carFingerprint == CAR.ODYSSEY_CHN:
signals += [("DRIVERS_DOOR_OPEN", "SCM_BUTTONS", 1)]
@@ -225,7 +225,7 @@ class CarState(CarStateBase):
# ******************* parse out can *******************
# TODO: find wheels moving bit in dbc
- if self.CP.carFingerprint in (CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G):
+ if self.CP.carFingerprint in (CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G, CAR.HONDA_E):
ret.standstill = cp.vl["ENGINE_DATA"]["XMISSION_SPEED"] < 0.1
ret.doorOpen = bool(cp.vl["SCM_FEEDBACK"]["DRIVERS_DOOR_OPEN"])
elif self.CP.carFingerprint == CAR.ODYSSEY_CHN:
@@ -276,7 +276,7 @@ class CarState(CarStateBase):
self.brake_hold = cp.vl["VSA_STATUS"]["BRAKE_HOLD_ACTIVE"]
if self.CP.carFingerprint in (CAR.CIVIC, CAR.ODYSSEY, CAR.CRV_5G, CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH,
- CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G):
+ CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G, CAR.HONDA_E):
self.park_brake = cp.vl["EPB_STATUS"]["EPB_STATE"] != 0
main_on = cp.vl["SCM_FEEDBACK"]["MAIN_ON"]
elif self.CP.carFingerprint == CAR.ODYSSEY_CHN:
diff --git a/selfdrive/car/honda/interface.py b/selfdrive/car/honda/interface.py
index fbad2eba61..f99e6f75bb 100755
--- a/selfdrive/car/honda/interface.py
+++ b/selfdrive/car/honda/interface.py
@@ -289,6 +289,16 @@ class CarInterface(CarInterfaceBase):
tire_stiffness_factor = 0.82
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]]
+ elif candidate == CAR.HONDA_E:
+ stop_and_go = True
+ ret.mass = 3338.8 * CV.LB_TO_KG + STD_CARGO_KG
+ ret.wheelbase = 2.5
+ ret.centerToFront = ret.wheelbase * 0.5
+ ret.steerRatio = 16.71
+ ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end
+ tire_stiffness_factor = 0.82
+ ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]] # TODO: can probably use some tuning
+
else:
raise ValueError("unsupported car %s" % candidate)
diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py
index 9497d16aa7..8e0b59d360 100644
--- a/selfdrive/car/honda/values.py
+++ b/selfdrive/car/honda/values.py
@@ -75,6 +75,7 @@ class CAR:
PILOT_2019 = "HONDA PILOT 2019"
RIDGELINE = "HONDA RIDGELINE 2017"
INSIGHT = "HONDA INSIGHT 2019"
+ HONDA_E = "HONDA E 2020"
# diag message that in some Nidec cars only appear with 1s freq if VIN query is performed
DIAG_MSGS = {1600: 5, 1601: 8}
@@ -1231,6 +1232,32 @@ FW_VERSIONS = {
b'78109-TV9-A510\x00\x00',
],
},
+ CAR.HONDA_E:{
+ (Ecu.eps, 0x18DA30F1, None):[
+ b'39990-TYF-N030\x00\x00'
+ ],
+ (Ecu.gateway, 0x18DAEFF1, None):[
+ b'38897-TYF-E140\x00\x00'
+ ],
+ (Ecu.shiftByWire, 0x18DA0BF1, None):[
+ b'54008-TYF-E010\x00\x00'
+ ],
+ (Ecu.srs, 0x18DA53F1, None):[
+ b'77959-TYF-G430\x00\x00'
+ ],
+ (Ecu.combinationMeter, 0x18DA60F1, None):[
+ b'78108-TYF-G610\x00\x00'
+ ],
+ (Ecu.fwdRadar, 0x18DAB0F1, None):[
+ b'36802-TYF-E030\x00\x00'
+ ],
+ (Ecu.fwdCamera, 0x18DAB5F1, None):[
+ b'36161-TYF-E020\x00\x00'
+ ],
+ (Ecu.vsa, 0x18DA28F1, None):[
+ b'57114-TYF-E030\x00\x00'
+ ],
+ },
}
DBC = {
@@ -1254,6 +1281,7 @@ DBC = {
CAR.PILOT_2019: dbc_dict('honda_pilot_touring_2017_can_generated', 'acura_ilx_2016_nidec'),
CAR.RIDGELINE: dbc_dict('honda_ridgeline_black_edition_2017_can_generated', 'acura_ilx_2016_nidec'),
CAR.INSIGHT: dbc_dict('honda_insight_ex_2019_can_generated', None),
+ CAR.HONDA_E: dbc_dict('acura_rdx_2020_can_generated', None),
}
STEER_THRESHOLD = {
@@ -1273,5 +1301,5 @@ SPEED_FACTOR = {
}
HONDA_NIDEC_ALT_PCM_ACCEL = set([CAR.ODYSSEY])
-HONDA_BOSCH = set([CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_5G, CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G])
-HONDA_BOSCH_ALT_BRAKE_SIGNAL = set([CAR.ACCORD, CAR.CRV_5G, CAR.ACURA_RDX_3G])
+HONDA_BOSCH = set([CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_5G, CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G, CAR.HONDA_E])
+HONDA_BOSCH_ALT_BRAKE_SIGNAL = set([CAR.ACCORD, CAR.CRV_5G, CAR.ACURA_RDX_3G])
\ No newline at end of file
diff --git a/selfdrive/test/test_models.py b/selfdrive/test/test_models.py
index 0d82fd2203..34e9e83152 100755
--- a/selfdrive/test/test_models.py
+++ b/selfdrive/test/test_models.py
@@ -180,7 +180,7 @@ class TestCarModel(unittest.TestCase):
# TODO: honda nidec: do same checks in carState and panda
if "brakePressed" in failed_checks and self.CP.carName == 'honda' and \
- (self.car_model not in HONDA_BOSCH or self.car_model == HONDA.CRV_HYBRID):
+ (self.car_model not in HONDA_BOSCH or self.car_model in [HONDA.CRV_HYBRID, HONDA.HONDA_E]):
if failed_checks['brakePressed'] < 150:
del failed_checks['brakePressed']
diff --git a/selfdrive/test/test_routes.py b/selfdrive/test/test_routes.py
index fd58145ac7..92cd23b2bc 100755
--- a/selfdrive/test/test_routes.py
+++ b/selfdrive/test/test_routes.py
@@ -62,6 +62,7 @@ routes = [
TestRoute("0a78dfbacc8504ef|2020-03-04--13-29-55", HONDA.CIVIC_BOSCH),
TestRoute("f34a60d68d83b1e5|2020-10-06--14-35-55", HONDA.ACURA_RDX),
TestRoute("54fd8451b3974762|2021-04-01--14-50-10", HONDA.RIDGELINE),
+ TestRoute("2d5808fae0b38ac6|2021-09-01--17-14-11", HONDA.HONDA_E),
TestRoute("6fe86b4e410e4c37|2020-07-22--16-27-13", HYUNDAI.HYUNDAI_GENESIS),
TestRoute("70c5bec28ec8e345|2020-08-08--12-22-23", HYUNDAI.GENESIS_G70),