2020-02-03 22:54:05 -08:00
# include "adc_subscription.h"
# include "engine.h"
# include "error_handling.h"
# include "global.h"
# include "functional_sensor.h"
2020-05-18 11:32:00 -07:00
# include "redundant_sensor.h"
2020-03-22 14:29:01 -07:00
# include "proxy_sensor.h"
2020-02-03 22:54:05 -08:00
# include "linear_func.h"
# include "tps.h"
EXTERN_ENGINE ;
2020-03-22 14:09:46 -07:00
LinearFunc tpsFunc1p ( TPS_TS_CONVERSION ) ;
2020-05-18 11:32:00 -07:00
LinearFunc tpsFunc1s ( TPS_TS_CONVERSION ) ;
2020-03-22 14:09:46 -07:00
LinearFunc tpsFunc2p ( TPS_TS_CONVERSION ) ;
2020-05-18 11:32:00 -07:00
LinearFunc tpsFunc2s ( TPS_TS_CONVERSION ) ;
2020-02-03 22:54:05 -08:00
2020-05-18 11:32:00 -07:00
FunctionalSensor tpsSens1p ( SensorType : : Tps1Primary , MS2NT ( 10 ) ) ;
FunctionalSensor tpsSens1s ( SensorType : : Tps1Secondary , MS2NT ( 10 ) ) ;
FunctionalSensor tpsSens2p ( SensorType : : Tps2Primary , MS2NT ( 10 ) ) ;
FunctionalSensor tpsSens2s ( SensorType : : Tps2Secondary , MS2NT ( 10 ) ) ;
RedundantSensor tps1 ( SensorType : : Tps1 , SensorType : : Tps1Primary , SensorType : : Tps1Secondary ) ;
RedundantSensor tps2 ( SensorType : : Tps2 , SensorType : : Tps2Primary , SensorType : : Tps2Secondary ) ;
2020-02-03 22:54:05 -08:00
2020-05-23 16:48:32 -07:00
LinearFunc pedalFuncPrimary ;
LinearFunc pedalFuncSecondary ;
FunctionalSensor pedalSensorPrimary ( SensorType : : AcceleratorPedalPrimary , MS2NT ( 10 ) ) ;
FunctionalSensor pedalSensorSecondary ( SensorType : : AcceleratorPedalSecondary , MS2NT ( 10 ) ) ;
RedundantSensor pedal ( SensorType : : AcceleratorPedal , SensorType : : AcceleratorPedalPrimary , SensorType : : AcceleratorPedalSecondary ) ;
2020-03-22 14:09:46 -07:00
2020-03-22 14:29:01 -07:00
// This sensor indicates the driver's throttle intent - Pedal if we have one, TPS if not.
ProxySensor driverIntent ( SensorType : : DriverThrottleIntent ) ;
2020-09-18 00:04:07 -07:00
// These sensors are TPS-like, so handle them in here too
LinearFunc wastegateFunc ( PACK_MULT_VOLTAGE ) ;
LinearFunc idlePosFunc ( PACK_MULT_VOLTAGE ) ;
FunctionalSensor wastegateSens ( SensorType : : WastegatePosition , MS2NT ( 10 ) ) ;
FunctionalSensor idlePosSens ( SensorType : : IdlePosition , MS2NT ( 10 ) ) ;
2020-12-05 21:41:49 -08:00
static bool configureTps ( LinearFunc & func , float closed , float open , float min , float max , const char * msg ) {
float scaledClosed = closed / func . getDivideInput ( ) ;
float scaledOpen = open / func . getDivideInput ( ) ;
float split = absF ( scaledOpen - scaledClosed ) ;
// If the voltage for closed vs. open is very near, something is wrong with your calibration
if ( split < 0.5f ) {
2020-12-06 05:34:10 -08:00
/*
* todo : fix this , this fails HW CI at the moment
2020-12-06 05:30:31 -08:00
firmwareError ( OBD_Throttle_Position_Sensor_Circuit_Malfunction , " Sensor \" %s \" problem: open %f/closed %f calibration values are too close together. Please check your wiring! " , msg ,
open ,
closed ) ;
2020-12-05 21:41:49 -08:00
return false ;
2020-12-06 05:34:10 -08:00
*/
2020-12-05 21:41:49 -08:00
}
2020-02-03 22:54:05 -08:00
func . configure (
2020-03-22 14:09:46 -07:00
closed , 0 ,
open , 100 ,
2020-04-05 06:10:08 -07:00
min , max
2020-02-03 22:54:05 -08:00
) ;
2020-12-05 21:41:49 -08:00
return true ;
2020-02-08 01:22:23 -08:00
}
2020-05-18 11:32:00 -07:00
static bool initTpsFunc ( LinearFunc & func , FunctionalSensor & sensor , adc_channel_e channel , float closed , float open , float min , float max ) {
2020-02-08 01:22:23 -08:00
// Only register if we have a sensor
if ( channel = = EFI_ADC_NONE ) {
2020-05-18 11:32:00 -07:00
return false ;
2020-02-08 01:22:23 -08:00
}
2020-12-05 21:41:49 -08:00
// If the configuration was invalid, don't continues to configure the sensor
if ( ! configureTps ( func , closed , open , min , max , sensor . getSensorName ( ) ) ) {
return false ;
}
2020-02-03 22:54:05 -08:00
sensor . setFunction ( func ) ;
2020-08-21 16:47:12 -07:00
AdcSubscription : : SubscribeSensor ( sensor , channel , 200 ) ;
2020-02-03 22:54:05 -08:00
2020-12-06 12:00:30 -08:00
return sensor . Register ( ) ;
2020-05-18 11:32:00 -07:00
}
static void initTpsFuncAndRedund ( RedundantSensor & redund , LinearFunc & func , FunctionalSensor & sensor , adc_channel_e channel , float closed , float open , float min , float max ) {
bool hasSecond = initTpsFunc ( func , sensor , channel , closed , open , min , max ) ;
redund . configure ( 5.0f , ! hasSecond ) ;
2020-12-06 12:00:30 -08:00
redund . Register ( ) ;
2020-02-03 22:54:05 -08:00
}
2020-08-31 04:45:52 -07:00
void initTps ( DECLARE_CONFIG_PARAMETER_SIGNATURE ) {
2020-11-14 15:05:27 -08:00
percent_t min = CONFIG ( tpsErrorDetectionTooLow ) ;
percent_t max = CONFIG ( tpsErrorDetectionTooHigh ) ;
2020-04-05 06:10:08 -07:00
2020-09-06 17:21:01 -07:00
if ( ! CONFIG ( consumeObdSensors ) ) {
initTpsFunc ( tpsFunc1p , tpsSens1p , CONFIG ( tps1_1AdcChannel ) , CONFIG ( tpsMin ) , CONFIG ( tpsMax ) , min , max ) ;
initTpsFuncAndRedund ( tps1 , tpsFunc1s , tpsSens1s , CONFIG ( tps1_2AdcChannel ) , CONFIG ( tps1SecondaryMin ) , CONFIG ( tps1SecondaryMax ) , min , max ) ;
initTpsFunc ( tpsFunc2p , tpsSens2p , CONFIG ( tps2_1AdcChannel ) , CONFIG ( tps2Min ) , CONFIG ( tps2Max ) , min , max ) ;
initTpsFuncAndRedund ( tps2 , tpsFunc2s , tpsSens2s , CONFIG ( tps2_2AdcChannel ) , CONFIG ( tps2SecondaryMin ) , CONFIG ( tps2SecondaryMax ) , min , max ) ;
initTpsFunc ( pedalFuncPrimary , pedalSensorPrimary , CONFIG ( throttlePedalPositionAdcChannel ) , CONFIG ( throttlePedalUpVoltage ) , CONFIG ( throttlePedalWOTVoltage ) , min , max ) ;
initTpsFuncAndRedund ( pedal , pedalFuncSecondary , pedalSensorSecondary , CONFIG ( throttlePedalPositionSecondAdcChannel ) , CONFIG ( throttlePedalSecondaryUpVoltage ) , CONFIG ( throttlePedalSecondaryWOTVoltage ) , min , max ) ;
2020-09-18 00:04:07 -07:00
// TPS-like stuff that isn't actually a TPS
initTpsFunc ( wastegateFunc , wastegateSens , CONFIG ( wastegatePositionSensor ) , CONFIG ( wastegatePositionMin ) , CONFIG ( wastegatePositionMax ) , min , max ) ;
initTpsFunc ( idlePosFunc , idlePosSens , CONFIG ( idlePositionSensor ) , CONFIG ( idlePositionMin ) , CONFIG ( idlePositionMax ) , min , max ) ;
2020-09-06 17:21:01 -07:00
}
2020-03-22 14:29:01 -07:00
// Route the pedal or TPS to driverIntent as appropriate
if ( CONFIG ( throttlePedalPositionAdcChannel ) ! = EFI_ADC_NONE ) {
driverIntent . setProxiedSensor ( SensorType : : AcceleratorPedal ) ;
} else {
driverIntent . setProxiedSensor ( SensorType : : Tps1 ) ;
}
2020-04-01 17:21:03 -07:00
2020-12-06 12:00:30 -08:00
driverIntent . Register ( ) ;
2020-02-03 22:54:05 -08:00
}
2020-02-08 01:22:23 -08:00
2020-08-31 04:45:52 -07:00
void reconfigureTps ( DECLARE_CONFIG_PARAMETER_SIGNATURE ) {
2020-04-05 06:10:08 -07:00
float min = CONFIG ( tpsErrorDetectionTooLow ) ;
float max = CONFIG ( tpsErrorDetectionTooHigh ) ;
2020-12-05 21:41:49 -08:00
configureTps ( tpsFunc1p , CONFIG ( tpsMin ) , CONFIG ( tpsMax ) , min , max , tpsSens1p . getSensorName ( ) ) ;
configureTps ( tpsFunc1s , CONFIG ( tps1SecondaryMin ) , CONFIG ( tps1SecondaryMax ) , min , max , tpsSens1s . getSensorName ( ) ) ;
configureTps ( tpsFunc2p , CONFIG ( tps2Min ) , CONFIG ( tps2Max ) , min , max , tpsSens2p . getSensorName ( ) ) ;
configureTps ( tpsFunc2s , CONFIG ( tps2SecondaryMin ) , CONFIG ( tps2SecondaryMax ) , min , max , tpsSens2s . getSensorName ( ) ) ;
2020-05-18 11:32:00 -07:00
2020-12-05 21:41:49 -08:00
configureTps ( pedalFuncPrimary , CONFIG ( throttlePedalUpVoltage ) , CONFIG ( throttlePedalWOTVoltage ) , min , max , pedalSensorPrimary . getSensorName ( ) ) ;
configureTps ( pedalFuncSecondary , CONFIG ( throttlePedalSecondaryUpVoltage ) , CONFIG ( throttlePedalSecondaryWOTVoltage ) , min , max , pedalSensorSecondary . getSensorName ( ) ) ;
2020-09-18 00:04:07 -07:00
2020-12-05 21:41:49 -08:00
configureTps ( wastegateFunc , CONFIG ( wastegatePositionMin ) , CONFIG ( wastegatePositionMax ) , min , max , wastegateSens . getSensorName ( ) ) ;
configureTps ( idlePosFunc , CONFIG ( idlePositionMin ) , CONFIG ( idlePositionMax ) , min , max , idlePosSens . getSensorName ( ) ) ;
2020-02-08 01:22:23 -08:00
}