/// <summary> /// Consturctor of FuelTripCalculator. /// </summary> /// <param name="option">Calculation option.</param> /// <param name="calculationMethod">Calclation method</param> public FuelTripCalculator(FuelTripCalculatorOption option, FuelCalculationMethod calculationMethod) { this.calculatorOption = option; this.calculationMethod = calculationMethod; totalTripFuel = new TripFuelContent(); sectElapsed = 0; sectStoreMax = 60; sectSpan = 60 * 1000; sectTripFuelTemporary = new TripFuelContent(); sectTripFuelQueue = new Queue <TripFuelContent>(); sectTripFuelLatest = new TripFuelContent(); saveElapsedTime = 0; //Set data folder and file path. folderPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); filePath = Path.Combine(folderPath, "." + "FUELTRIP_Logger"); loadTripFuel(); stopWatch = new Stopwatch(); stopWatch.Reset(); }
/// <summary> /// Create the list of parameter code from data source and calculation method setting. /// </summary> /// <returns>The list of required parameter code.</returns> public RequiredParameterCode getRequiredParameterCodes() { RequiredParameterCode requiredCodes = new RequiredParameterCode(); FuelCalculationMethod calcMethod = this.Calculation.FuelCalculationMethod; DataSource dataSource = this.Calculation.DataSource; // Decide parameter code for trip (vehicle speed) switch (dataSource.VehicleSpeedSource) { case WebSocketType.SSM: requiredCodes.SSMCodes.Add(SSMParameterCode.Vehicle_Speed); break; case WebSocketType.ARDUINO: requiredCodes.ArduinoCodes.Add(ArduinoParameterCode.Vehicle_Speed); break; case WebSocketType.ELM327: requiredCodes.ELM327OBDCodes.Add(OBDIIParameterCode.Vehicle_Speed); break; default: throw new ArgumentException("Vehicle speed is supported only on SSM, Arduino, ELM327."); } // Decide parameter code for fuel consumption. switch (calcMethod) { case FuelCalculationMethod.FUEL_RATE: { switch (dataSource.FuelRateSource) { case WebSocketType.ELM327: requiredCodes.ELM327OBDCodes.Add(OBDIIParameterCode.Engine_fuel_rate); break; default: throw new ArgumentException("Engine Fuel rate is supported only on ELM327."); } break; } case FuelCalculationMethod.RPM_INJECTION_PW: { switch (dataSource.InjectionPWSource) { case WebSocketType.SSM: requiredCodes.SSMCodes.Add(SSMParameterCode.Fuel_Injection_1_Pulse_Width); break; default: throw new ArgumentException("Fuel injection pulse width is supported only on SSM"); } switch (dataSource.RPMSource) { case WebSocketType.DEFI: requiredCodes.DefiCodes.Add(DefiParameterCode.Engine_Speed); break; case WebSocketType.SSM: requiredCodes.SSMCodes.Add(SSMParameterCode.Engine_Speed); break; case WebSocketType.ARDUINO: requiredCodes.ArduinoCodes.Add(ArduinoParameterCode.Engine_Speed); break; case WebSocketType.ELM327: requiredCodes.ELM327OBDCodes.Add(OBDIIParameterCode.Engine_Speed); break; } break; } case FuelCalculationMethod.MASS_AIR_FLOW_AF: { switch (dataSource.MassAirFlowSource) { case WebSocketType.SSM: requiredCodes.SSMCodes.Add(SSMParameterCode.Mass_Air_Flow); break; case WebSocketType.ELM327: requiredCodes.ELM327OBDCodes.Add(OBDIIParameterCode.Mass_Air_Flow); break; default: throw new ArgumentException("Mass air flow is supported only on SSM or ELM327."); } switch (dataSource.AFRatioSource) { case WebSocketType.SSM: requiredCodes.SSMCodes.Add(SSMParameterCode.Air_Fuel_Sensor_1); break; case WebSocketType.ELM327: requiredCodes.ELM327OBDCodes.Add(OBDIIParameterCode.Command_equivalence_ratio); break; default: throw new ArgumentException("A/F ratio is supported only on SSM or ELM327."); } break; } case FuelCalculationMethod.MASS_AIR_FLOW: { switch (dataSource.MassAirFlowSource) { case WebSocketType.SSM: requiredCodes.SSMCodes.Add(SSMParameterCode.Mass_Air_Flow); break; case WebSocketType.ELM327: requiredCodes.ELM327OBDCodes.Add(OBDIIParameterCode.Mass_Air_Flow); break; default: throw new ArgumentException("Mass air flow is supported only on SSM or ELM327."); } break; } } return(requiredCodes); }