From e2f0de917c4b174b9ed8e944c2ce6032557ce825 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Sun, 5 Jul 2026 09:54:44 -0700 Subject: [PATCH 01/15] Change regen strength to be a percentage-like quantity Signed-off-by: Daniel Hansen --- ECU/Application/Src/StateTicks.c | 2 +- ECU/Test/Src/StateTicksTest.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ECU/Application/Src/StateTicks.c b/ECU/Application/Src/StateTicks.c index 2a78ae364..20f9a61e0 100644 --- a/ECU/Application/Src/StateTicks.c +++ b/ECU/Application/Src/StateTicks.c @@ -58,7 +58,7 @@ ECU_StateData stateLump = { .apps_1_max = 1897, .apps_2_max = 1926, // Regen - .regen_strength = 2, + .regen_strength = 0.8f, .enable_regen = false, .SDC_startup_condition = true}; diff --git a/ECU/Test/Src/StateTicksTest.c b/ECU/Test/Src/StateTicksTest.c index 41e86c9b0..5c96972dd 100644 --- a/ECU/Test/Src/StateTicksTest.c +++ b/ECU/Test/Src/StateTicksTest.c @@ -108,7 +108,7 @@ int main(void) .apps_1_max = 1897, .apps_2_max = 1926, // Regen - .regen_strength = 2, + .regen_strength = 0.8f, .enable_regen = false}; defaultState.bms_sense = 1.5; From d6bece9e5171c473cb215e3f407f9de87a94b99a Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Sun, 5 Jul 2026 09:54:58 -0700 Subject: [PATCH 02/15] Flat regen while brakes are pressed Signed-off-by: Daniel Hansen --- ECU/Application/Src/StateTicks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ECU/Application/Src/StateTicks.c b/ECU/Application/Src/StateTicks.c index 20f9a61e0..25c6fc952 100644 --- a/ECU/Application/Src/StateTicks.c +++ b/ECU/Application/Src/StateTicks.c @@ -261,7 +261,7 @@ void ECU_Drive_Active(ECU_StateData *stateData) if (stateData->apps_bse_violation || !apps_plausible) { torque_request = 0; } else if (stateData->enable_regen && PressingBrake(stateData) && stateData->vehicle_speed_mph > REGEN_MIN_SPEED_MPH) { - torque_request = -MIN_WITH_TYPES(CalcBrakePressure(stateData) / 5000.0f * stateData->regen_strength, 1.0f) * MAX_REVERSE_CURRENT_AMPS; + torque_request = -MAX_REVERSE_CURRENT_AMPS; } else { uint16_t max_current = 0; // Chosen max current for different power level / torque maps From 9fee2fdd1e71f50da5e17902c4bd38b2e7ccf37c Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Sun, 19 Jul 2026 23:24:28 -0700 Subject: [PATCH 03/15] Revert previous change to regen strength Signed-off-by: Daniel Hansen --- ECU/Application/Src/StateTicks.c | 2 +- ECU/Test/Src/StateTicksTest.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ECU/Application/Src/StateTicks.c b/ECU/Application/Src/StateTicks.c index 25c6fc952..b1f1f2683 100644 --- a/ECU/Application/Src/StateTicks.c +++ b/ECU/Application/Src/StateTicks.c @@ -58,7 +58,7 @@ ECU_StateData stateLump = { .apps_1_max = 1897, .apps_2_max = 1926, // Regen - .regen_strength = 0.8f, + .regen_strength = 2, .enable_regen = false, .SDC_startup_condition = true}; diff --git a/ECU/Test/Src/StateTicksTest.c b/ECU/Test/Src/StateTicksTest.c index 5c96972dd..41e86c9b0 100644 --- a/ECU/Test/Src/StateTicksTest.c +++ b/ECU/Test/Src/StateTicksTest.c @@ -108,7 +108,7 @@ int main(void) .apps_1_max = 1897, .apps_2_max = 1926, // Regen - .regen_strength = 0.8f, + .regen_strength = 2, .enable_regen = false}; defaultState.bms_sense = 1.5; From 17ac3745802e460378855b1909a093487a1c08cd Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Sun, 19 Jul 2026 23:26:29 -0700 Subject: [PATCH 04/15] Add a caveat for throttle not being pressed rather than just brakes being pressed Signed-off-by: Daniel Hansen --- ECU/Application/Src/StateTicks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ECU/Application/Src/StateTicks.c b/ECU/Application/Src/StateTicks.c index b1f1f2683..ac68d10da 100644 --- a/ECU/Application/Src/StateTicks.c +++ b/ECU/Application/Src/StateTicks.c @@ -260,7 +260,7 @@ void ECU_Drive_Active(ECU_StateData *stateData) if (stateData->apps_bse_violation || !apps_plausible) { torque_request = 0; - } else if (stateData->enable_regen && PressingBrake(stateData) && stateData->vehicle_speed_mph > REGEN_MIN_SPEED_MPH) { + } else if (stateData->enable_regen && (PressingBrake(stateData) || CalcAccPedalTravel(stateData) < (stateData->apps_deadzone + 0.05f)) && stateData->vehicle_speed_mph > REGEN_MIN_SPEED_MPH) { torque_request = -MAX_REVERSE_CURRENT_AMPS; } else { uint16_t max_current = 0; From c9c391f9bd40bcb37b1932576fe1a8e3c53e9ad4 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Sun, 19 Jul 2026 23:27:42 -0700 Subject: [PATCH 05/15] Actually enable regen Signed-off-by: Daniel Hansen --- ECU/Application/Src/StateTicks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ECU/Application/Src/StateTicks.c b/ECU/Application/Src/StateTicks.c index ac68d10da..edcdf8b62 100644 --- a/ECU/Application/Src/StateTicks.c +++ b/ECU/Application/Src/StateTicks.c @@ -58,8 +58,8 @@ ECU_StateData stateLump = { .apps_1_max = 1897, .apps_2_max = 1926, // Regen - .regen_strength = 2, - .enable_regen = false, + .regen_strength = 2, // Not used + .enable_regen = true, .SDC_startup_condition = true}; static uint32_t millis_since_boot; From d6cc6e790b75c220feb744b9367028d8aa37e8ba Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Tue, 4 Aug 2026 00:57:55 -0700 Subject: [PATCH 06/15] Revise header safe max forward/reverse current limits Signed-off-by: Daniel Hansen --- ECU/Application/Inc/StateUtils.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ECU/Application/Inc/StateUtils.h b/ECU/Application/Inc/StateUtils.h index 955b0a520..b3d56a790 100644 --- a/ECU/Application/Inc/StateUtils.h +++ b/ECU/Application/Inc/StateUtils.h @@ -16,8 +16,8 @@ uint32_t MillisecondsSinceBoot(void); #define REGEN_MIN_SPEED_MPH 3.106856f // 5 KPH -#define MAX_CURRENT_AMPS 375.0f // Determined by Ryan -#define MAX_REVERSE_CURRENT_AMPS 30.0f // TODO: Change as appropriate +#define MAX_FORWARD_CURRENT_AMPS 325.0f +#define MAX_REVERSE_CURRENT_AMPS 300.0f #define ECU_STATUS_MSG_PERIOD_MILLIS (1000) #define TRACTIVE_SYSTEM_MAX_PERMITTED_DISCHARGE_TIME_MILLIS (5000) From 0959862ed7dcc9f7ea82b8b27ae5f650cafbfc42 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Tue, 4 Aug 2026 00:58:45 -0700 Subject: [PATCH 07/15] Setup for 300A forward current default Signed-off-by: Daniel Hansen --- ECU/Application/Src/StateTicks.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/ECU/Application/Src/StateTicks.c b/ECU/Application/Src/StateTicks.c index edcdf8b62..67f16abe6 100644 --- a/ECU/Application/Src/StateTicks.c +++ b/ECU/Application/Src/StateTicks.c @@ -263,33 +263,32 @@ void ECU_Drive_Active(ECU_StateData *stateData) } else if (stateData->enable_regen && (PressingBrake(stateData) || CalcAccPedalTravel(stateData) < (stateData->apps_deadzone + 0.05f)) && stateData->vehicle_speed_mph > REGEN_MIN_SPEED_MPH) { torque_request = -MAX_REVERSE_CURRENT_AMPS; } else { - uint16_t max_current = 0; - // Chosen max current for different power level / torque maps + uint16_t max_fwd_current = 0; switch (stateData->powerlevel) { case 0: - max_current = 100; + max_fwd_current = 300; break; case 1: - max_current = 200; + max_fwd_current = 300; break; case 2: - max_current = 250; + max_fwd_current = 300; break; case 3: - max_current = 300; + max_fwd_current = 300; break; case 4: - max_current = 325; + max_fwd_current = 300; break; case 5: - max_current = 350; + max_fwd_current = 300; break; default: - LOGOMATIC("Invalid power level: %d. Defaulting to no current.\n", stateData->powerlevel); - max_current = 0; + LOGOMATIC("Invalid power level: %d. Defaulting to no forward torque.\n", stateData->powerlevel); + max_fwd_current = 0; break; } - torque_request = fminf(CalcAccPedalTravel(stateData) * max_current, MAX_CURRENT_AMPS); + torque_request = fminf(CalcAccPedalTravel(stateData) * max_fwd_current, MAX_FORWARD_CURRENT_AMPS); } static uint32_t last_can_inverter_request_millis = 0; From 52cdc27a6b95619f12868e05fa36ab3d52e6b488 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Tue, 4 Aug 2026 00:59:55 -0700 Subject: [PATCH 08/15] Setup reverse current as 60/120/150/180/210/240 Amps Signed-off-by: Daniel Hansen --- ECU/Application/Src/StateTicks.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/ECU/Application/Src/StateTicks.c b/ECU/Application/Src/StateTicks.c index 67f16abe6..f47f361a7 100644 --- a/ECU/Application/Src/StateTicks.c +++ b/ECU/Application/Src/StateTicks.c @@ -261,7 +261,32 @@ void ECU_Drive_Active(ECU_StateData *stateData) if (stateData->apps_bse_violation || !apps_plausible) { torque_request = 0; } else if (stateData->enable_regen && (PressingBrake(stateData) || CalcAccPedalTravel(stateData) < (stateData->apps_deadzone + 0.05f)) && stateData->vehicle_speed_mph > REGEN_MIN_SPEED_MPH) { - torque_request = -MAX_REVERSE_CURRENT_AMPS; + uint16_t rev_current = 0; + switch (stateData->powerlevel) { + case 0: + rev_current = 60; + break; + case 1: + rev_current = 120; + break; + case 2: + rev_current = 150; + break; + case 3: + rev_current = 180; + break; + case 4: + rev_current = 210; + break; + case 5: + rev_current = 240; + break; + default: + LOGOMATIC("Invalid power level: %d. Defaulting to no regen.\n", stateData->powerlevel); + rev_current = 0; + break; + } + torque_request = -fminf(rev_current, MAX_REVERSE_CURRENT_AMPS); } else { uint16_t max_fwd_current = 0; switch (stateData->powerlevel) { From b8fd4edd0de6611ff0c598bf07ebf4f6ea022ff4 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Tue, 4 Aug 2026 01:00:53 -0700 Subject: [PATCH 09/15] Using an explicitly TBD torque mapping (see CANdo) Signed-off-by: Daniel Hansen --- ECU/Application/Src/StateTicks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ECU/Application/Src/StateTicks.c b/ECU/Application/Src/StateTicks.c index f47f361a7..b1d79d035 100644 --- a/ECU/Application/Src/StateTicks.c +++ b/ECU/Application/Src/StateTicks.c @@ -34,7 +34,7 @@ ECU_StateData stateLump = { // Startup at minimum power .powerlevel = 0, // See CANdo specification - .torquemap = 1, + .torquemap = 2, // APPS Deadzone .apps_deadzone = 0.08f, // BMS thresholds From 58c47f3017fdc9aed9af800938db25843475677d Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Tue, 4 Aug 2026 01:24:53 -0700 Subject: [PATCH 10/15] Use the already made constants in the gear ratio formula Signed-off-by: Daniel Hansen --- ECU/Application/Src/CANdler.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ECU/Application/Src/CANdler.c b/ECU/Application/Src/CANdler.c index cd1bd97d7..85778c2cf 100644 --- a/ECU/Application/Src/CANdler.c +++ b/ECU/Application/Src/CANdler.c @@ -18,7 +18,7 @@ #define NUM_MOTOR_POLE_PAIRS 10 #define DRIVEN_SPROCKET_TEETH 51.0f #define DRIVING_SPROCKET_TEETH 19.0f -#define GEAR_RATIO (51.0f / 19.0f) +#define GEAR_RATIO (DRIVEN_SPROCKET_TEETH / DRIVING_SPROCKET_TEETH) void ReportBadMessageLength(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id) { From 7bb0d060583b154fa1eb57759c8e644348e05255 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Wed, 5 Aug 2026 13:28:02 -0700 Subject: [PATCH 11/15] Remap to have somewhat linear regen mappings ``` 0 to 0.05 is max regen torque 0.05 to 0.1 is linear down to 0 0.1 to 0.2 is 0 0.2 to 1 is linear to max forward torque 1 is max forward torque ``` Signed-off-by: Daniel Hansen --- ECU/Application/Src/StateTicks.c | 127 ++++++++++++++++++------------- 1 file changed, 72 insertions(+), 55 deletions(-) diff --git a/ECU/Application/Src/StateTicks.c b/ECU/Application/Src/StateTicks.c index b1d79d035..52ae0d0f2 100644 --- a/ECU/Application/Src/StateTicks.c +++ b/ECU/Application/Src/StateTicks.c @@ -58,7 +58,7 @@ ECU_StateData stateLump = { .apps_1_max = 1897, .apps_2_max = 1926, // Regen - .regen_strength = 2, // Not used + .regen_strength = 2, // Not used .enable_regen = true, .SDC_startup_condition = true}; @@ -258,62 +258,79 @@ void ECU_Drive_Active(ECU_StateData *stateData) float torque_request; bool apps_plausible = (millis_since_boot - last_apps_plausible_frame_millis) <= MAX_APPS_IMPLAUSIBLE_TIME_MS; + float pedal = CalcAccPedalTravel(stateData); + + uint16_t max_rev_current = 0; + switch (stateData->powerlevel) { + case 0: + max_rev_current = 60; + break; + case 1: + max_rev_current = 120; + break; + case 2: + max_rev_current = 150; + break; + case 3: + max_rev_current = 180; + break; + case 4: + max_rev_current = 210; + break; + case 5: + max_rev_current = 240; + break; + default: + LOGOMATIC("Invalid power level: %d. Defaulting to no regen.\n", stateData->powerlevel); + max_rev_current = 0; + break; + } + + uint16_t max_fwd_current = 0; + switch (stateData->powerlevel) { + case 0: + max_fwd_current = 300; + break; + case 1: + max_fwd_current = 300; + break; + case 2: + max_fwd_current = 300; + break; + case 3: + max_fwd_current = 300; + break; + case 4: + max_fwd_current = 300; + break; + case 5: + max_fwd_current = 300; + break; + default: + LOGOMATIC("Invalid power level: %d. Defaulting to no forward torque.\n", stateData->powerlevel); + max_fwd_current = 0; + break; + } + + if (pedal < 0.05f) { + torque_request = -max_rev_current; + } else if (pedal < 0.1f) { + torque_request = -max_rev_current * (1.0f - (pedal - 0.05f) / 0.05f); + } else if (pedal < 0.2f) { + torque_request = 0.0f; + } else { + torque_request = max_fwd_current * ((pedal - 0.2f) / 0.8f); + } + + if (!stateData->enable_regen || stateData->vehicle_speed_mph <= REGEN_MIN_SPEED_MPH) { + torque_request = fmaxf(torque_request, 0); + } + + torque_request = fminf(torque_request, MAX_FORWARD_CURRENT_AMPS); + torque_request = fmaxf(torque_request, -MAX_REVERSE_CURRENT_AMPS); + if (stateData->apps_bse_violation || !apps_plausible) { torque_request = 0; - } else if (stateData->enable_regen && (PressingBrake(stateData) || CalcAccPedalTravel(stateData) < (stateData->apps_deadzone + 0.05f)) && stateData->vehicle_speed_mph > REGEN_MIN_SPEED_MPH) { - uint16_t rev_current = 0; - switch (stateData->powerlevel) { - case 0: - rev_current = 60; - break; - case 1: - rev_current = 120; - break; - case 2: - rev_current = 150; - break; - case 3: - rev_current = 180; - break; - case 4: - rev_current = 210; - break; - case 5: - rev_current = 240; - break; - default: - LOGOMATIC("Invalid power level: %d. Defaulting to no regen.\n", stateData->powerlevel); - rev_current = 0; - break; - } - torque_request = -fminf(rev_current, MAX_REVERSE_CURRENT_AMPS); - } else { - uint16_t max_fwd_current = 0; - switch (stateData->powerlevel) { - case 0: - max_fwd_current = 300; - break; - case 1: - max_fwd_current = 300; - break; - case 2: - max_fwd_current = 300; - break; - case 3: - max_fwd_current = 300; - break; - case 4: - max_fwd_current = 300; - break; - case 5: - max_fwd_current = 300; - break; - default: - LOGOMATIC("Invalid power level: %d. Defaulting to no forward torque.\n", stateData->powerlevel); - max_fwd_current = 0; - break; - } - torque_request = fminf(CalcAccPedalTravel(stateData) * max_fwd_current, MAX_FORWARD_CURRENT_AMPS); } static uint32_t last_can_inverter_request_millis = 0; From edfc90039029d5d324b303e6454c4425fd937d72 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Fri, 7 Aug 2026 23:12:54 -0700 Subject: [PATCH 12/15] Very important fix to not have crazy motor action Signed-off-by: Daniel Hansen --- ECU/Application/Src/StateTicks.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ECU/Application/Src/StateTicks.c b/ECU/Application/Src/StateTicks.c index 52ae0d0f2..51e2c8847 100644 --- a/ECU/Application/Src/StateTicks.c +++ b/ECU/Application/Src/StateTicks.c @@ -339,7 +339,14 @@ void ECU_Drive_Active(ECU_StateData *stateData) ECU_CAN_Send(GRCAN_BUS_PRIMARY, GRCAN_GR_Inv, GRCAN_INV_CMD, &message, sizeof(message)); ECU_CAN_Send_DTI(DTI_CONTROL_12_CAN_ID, &message.drive_enable, 1); message.set_ac_current = torque_request * 10; - ECU_CAN_Send_DTI(DTI_CONTROL_1_CAN_ID, &message.set_ac_current, 2); + LOGOMATIC("%f\t\t%f\n", stateData->vehicle_speed_mph, torque_request); + + if (torque_request < 0) { + message.set_ac_current = torque_request * -10; + ECU_CAN_Send_DTI(DTI_CONTROL_2_CAN_ID, &message.set_ac_current, 2); + } else { + ECU_CAN_Send_DTI(DTI_CONTROL_1_CAN_ID, &message.set_ac_current, 2); + } last_can_inverter_request_millis = millis_since_boot; } } From 583a9cd44a9adc46a57dda47620271d32bea5425 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Fri, 7 Aug 2026 23:13:09 -0700 Subject: [PATCH 13/15] Fix rtd button lights Signed-off-by: Daniel Hansen --- ECU/Application/Src/StateTicks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ECU/Application/Src/StateTicks.c b/ECU/Application/Src/StateTicks.c index 51e2c8847..19dc58a1c 100644 --- a/ECU/Application/Src/StateTicks.c +++ b/ECU/Application/Src/StateTicks.c @@ -34,7 +34,7 @@ ECU_StateData stateLump = { // Startup at minimum power .powerlevel = 0, // See CANdo specification - .torquemap = 2, + .torquemap = 1, // APPS Deadzone .apps_deadzone = 0.08f, // BMS thresholds From e2d592ba5040b352f345ac032795a1cd4bc321d9 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Fri, 7 Aug 2026 23:13:35 -0700 Subject: [PATCH 14/15] Reduce max reverse current significantly (tested 8/5/26) Signed-off-by: Daniel Hansen --- ECU/Application/Src/StateTicks.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ECU/Application/Src/StateTicks.c b/ECU/Application/Src/StateTicks.c index 19dc58a1c..3b503393a 100644 --- a/ECU/Application/Src/StateTicks.c +++ b/ECU/Application/Src/StateTicks.c @@ -263,22 +263,22 @@ void ECU_Drive_Active(ECU_StateData *stateData) uint16_t max_rev_current = 0; switch (stateData->powerlevel) { case 0: - max_rev_current = 60; + max_rev_current = 20; break; case 1: - max_rev_current = 120; + max_rev_current = 40; break; case 2: - max_rev_current = 150; + max_rev_current = 60; break; case 3: - max_rev_current = 180; + max_rev_current = 80; break; case 4: - max_rev_current = 210; + max_rev_current = 100; break; case 5: - max_rev_current = 240; + max_rev_current = 120; break; default: LOGOMATIC("Invalid power level: %d. Defaulting to no regen.\n", stateData->powerlevel); From c6d40aeae77d49c2886773890e00fc4e8c567558 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Wed, 12 Aug 2026 01:45:40 -0700 Subject: [PATCH 15/15] Refactor for easier parameters for current map See https://www.desmos.com/calculator/nxxz5zxgku No intended functionality change Untested! Signed-off-by: Daniel Hansen --- ECU/Application/Src/StateTicks.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/ECU/Application/Src/StateTicks.c b/ECU/Application/Src/StateTicks.c index 3b503393a..8892fc49c 100644 --- a/ECU/Application/Src/StateTicks.c +++ b/ECU/Application/Src/StateTicks.c @@ -312,14 +312,22 @@ void ECU_Drive_Active(ECU_StateData *stateData) break; } - if (pedal < 0.05f) { + // See https://www.desmos.com/calculator/nxxz5zxgku + const float A_REV_MAX_END_POINT = 0.05f; + const float B_DEADZONE_START_POINT = 0.1f; + const float C_DEADZONE_END_POINT = 0.2f; + + const float PEDAL_REV_TRANSITION_RANGE_INV = 1.0f / (B_DEADZONE_START_POINT - A_REV_MAX_END_POINT); + const float PEDAL_FWD_TRANSITION_RANGE_INV = 1.0f / (1.0f - C_DEADZONE_END_POINT); + + if (pedal < A_REV_MAX_END_POINT) { torque_request = -max_rev_current; - } else if (pedal < 0.1f) { - torque_request = -max_rev_current * (1.0f - (pedal - 0.05f) / 0.05f); - } else if (pedal < 0.2f) { + } else if (pedal < B_DEADZONE_START_POINT) { + torque_request = -max_rev_current * (1.0f - (pedal - A_REV_MAX_END_POINT) * PEDAL_REV_TRANSITION_RANGE_INV); + } else if (pedal < C_DEADZONE_END_POINT) { torque_request = 0.0f; } else { - torque_request = max_fwd_current * ((pedal - 0.2f) / 0.8f); + torque_request = max_fwd_current * (pedal - C_DEADZONE_END_POINT) * PEDAL_FWD_TRANSITION_RANGE_INV; } if (!stateData->enable_regen || stateData->vehicle_speed_mph <= REGEN_MIN_SPEED_MPH) {