adc resubscription of the same sensor (#4947)

* adc resubscription of the same sensor

* overload function name

* fix logic

* thermistors and map
This commit is contained in:
Matthew Kennedy 2023-01-06 05:09:17 -08:00 committed by GitHub
parent 834ed681d9
commit 1eb00e5ec9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 43 additions and 27 deletions

View File

@ -398,10 +398,6 @@ void addChannel(const char *name, adc_channel_e setting, adc_channel_mode_e mode
if (!isAdcChannelValid(setting)) { if (!isAdcChannelValid(setting)) {
return; return;
} }
if (/*type-limited (int)setting < 0 || */(int)setting>=HW_MAX_ADC_INDEX) {
firmwareError(CUSTOM_INVALID_ADC, "Invalid ADC setting %s", name);
return;
}
adcHwChannelEnabled[setting] = mode; adcHwChannelEnabled[setting] = mode;

View File

@ -12,6 +12,9 @@
/*static*/ void AdcSubscription::UnsubscribeSensor(FunctionalSensor&) { /*static*/ void AdcSubscription::UnsubscribeSensor(FunctionalSensor&) {
} }
/*static*/ void AdcSubscription::UnsubscribeSensor(FunctionalSensor&, adc_channel_e) {
}
#else #else
struct AdcSubscriptionEntry { struct AdcSubscriptionEntry {
@ -48,17 +51,27 @@ static AdcSubscriptionEntry* findEntry() {
return; return;
} }
const char* name = sensor.getSensorName(); // If you passed the same sensor again, resubscribe it with the new parameters
if (/*type-limited (int)setting < 0 || */(int)channel >= HW_MAX_ADC_INDEX) { auto entry = findEntry(&sensor);
firmwareError(CUSTOM_INVALID_ADC, "Invalid ADC setting %s", name);
return; if (entry) {
// If the channel didn't change, we're already set
if (entry->Channel == channel) {
return;
}
// avoid updates to this while we're mucking with the configuration
entry->Sensor = nullptr;
} else {
// If not already registered, get an empty (new) entry
entry = findEntry();
} }
auto entry = findEntry(); const char* name = sensor.getSensorName();
// Ensure that a free entry was found // Ensure that a free entry was found
if (!entry) { if (!entry) {
firmwareError(CUSTOM_INVALID_ADC, "too many ADC subscriptions"); firmwareError(CUSTOM_INVALID_ADC, "too many ADC subscriptions subscribing %s", name);
return; return;
} }
@ -104,6 +117,16 @@ static AdcSubscriptionEntry* findEntry() {
entry->Channel = EFI_ADC_NONE; entry->Channel = EFI_ADC_NONE;
} }
/*static*/ void AdcSubscription::UnsubscribeSensor(FunctionalSensor& sensor, adc_channel_e channel) {
// Find the old sensor
auto entry = findEntry(&sensor);
// if the channel changed, unsubscribe!
if (entry && entry->Channel != channel) {
AdcSubscription::UnsubscribeSensor(sensor);
}
}
void AdcSubscription::UpdateSubscribers(efitick_t nowNt) { void AdcSubscription::UpdateSubscribers(efitick_t nowNt) {
ScopePerf perf(PE::AdcSubscriptionUpdateSubscribers); ScopePerf perf(PE::AdcSubscriptionUpdateSubscribers);

View File

@ -11,6 +11,7 @@ class AdcSubscription {
public: public:
static void SubscribeSensor(FunctionalSensor &sensor, adc_channel_e channel, float lowpassCutoff, float voltsPerAdcVolt = 0.0f); static void SubscribeSensor(FunctionalSensor &sensor, adc_channel_e channel, float lowpassCutoff, float voltsPerAdcVolt = 0.0f);
static void UnsubscribeSensor(FunctionalSensor& sensor); static void UnsubscribeSensor(FunctionalSensor& sensor);
static void UnsubscribeSensor(FunctionalSensor& sensor, adc_channel_e newChannel);
static void UpdateSubscribers(efitick_t nowNt); static void UpdateSubscribers(efitick_t nowNt);
static void PrintInfo(); static void PrintInfo();

View File

@ -54,9 +54,7 @@ static void initFluidPressure(LinearFunc& func, FunctionalSensor& sensor, const
void initFluidPressure() { void initFluidPressure() {
initFluidPressure(oilpSensorFunc, oilpSensor, engineConfiguration->oilPressure, 10); initFluidPressure(oilpSensorFunc, oilpSensor, engineConfiguration->oilPressure, 10);
initFluidPressure(fuelPressureFuncLow, fuelPressureSensorLow, engineConfiguration->lowPressureFuel, 10); initFluidPressure(fuelPressureFuncLow, fuelPressureSensorLow, engineConfiguration->lowPressureFuel, 10);
if (isConfigurationChanged(highPressureFuel.hwChannel)) { initFluidPressure(fuelPressureFuncHigh, fuelPressureSensorHigh, engineConfiguration->highPressureFuel, 100);
initFluidPressure(fuelPressureFuncHigh, fuelPressureSensorHigh, engineConfiguration->highPressureFuel, 100);
}
initFluidPressure(auxLinear1Func, auxLinear1Sensor, engineConfiguration->auxLinear1, 10); initFluidPressure(auxLinear1Func, auxLinear1Sensor, engineConfiguration->auxLinear1, 10);
initFluidPressure(auxLinear2Func, auxLinear2Sensor, engineConfiguration->auxLinear2, 10); initFluidPressure(auxLinear2Func, auxLinear2Sensor, engineConfiguration->auxLinear2, 10);
@ -70,11 +68,9 @@ void initFluidPressure() {
} }
void deinitFluidPressure() { void deinitFluidPressure() {
AdcSubscription::UnsubscribeSensor(oilpSensor); AdcSubscription::UnsubscribeSensor(oilpSensor, engineConfiguration->oilPressure.hwChannel);
AdcSubscription::UnsubscribeSensor(fuelPressureSensorLow); AdcSubscription::UnsubscribeSensor(fuelPressureSensorLow, engineConfiguration->lowPressureFuel.hwChannel);
if (isConfigurationChanged(highPressureFuel.hwChannel)) { AdcSubscription::UnsubscribeSensor(fuelPressureSensorHigh, engineConfiguration->highPressureFuel.hwChannel);
AdcSubscription::UnsubscribeSensor(fuelPressureSensorHigh); AdcSubscription::UnsubscribeSensor(auxLinear1Sensor, engineConfiguration->auxLinear1.hwChannel);
} AdcSubscription::UnsubscribeSensor(auxLinear2Sensor, engineConfiguration->auxLinear2.hwChannel);
AdcSubscription::UnsubscribeSensor(auxLinear1Sensor);
AdcSubscription::UnsubscribeSensor(auxLinear2Sensor);
} }

View File

@ -129,6 +129,6 @@ void initMap() {
} }
void deinitMap() { void deinitMap() {
AdcSubscription::UnsubscribeSensor(slowMapSensor); AdcSubscription::UnsubscribeSensor(slowMapSensor, engineConfiguration->map.sensor.hwChannel);
AdcSubscription::UnsubscribeSensor(baroSensor); AdcSubscription::UnsubscribeSensor(baroSensor, engineConfiguration->baroSensor.hwChannel);
} }

View File

@ -112,8 +112,8 @@ void initThermistors() {
} }
void deinitThermistors() { void deinitThermistors() {
AdcSubscription::UnsubscribeSensor(clt); AdcSubscription::UnsubscribeSensor(clt, engineConfiguration->clt.adcChannel);
AdcSubscription::UnsubscribeSensor(iat); AdcSubscription::UnsubscribeSensor(iat, engineConfiguration->iat.adcChannel);
AdcSubscription::UnsubscribeSensor(aux1); AdcSubscription::UnsubscribeSensor(aux1, engineConfiguration->auxTempSensor1.adcChannel);
AdcSubscription::UnsubscribeSensor(aux2); AdcSubscription::UnsubscribeSensor(aux2, engineConfiguration->auxTempSensor2.adcChannel);
} }

View File

@ -23,5 +23,5 @@ void initVbatt() {
} }
void deinitVbatt() { void deinitVbatt() {
AdcSubscription::UnsubscribeSensor(vbattSensor); AdcSubscription::UnsubscribeSensor(vbattSensor, engineConfiguration->vbattAdcChannel);
} }