/// <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(); }
private void enqueueSectTripFuel(TripFuelContent content) { sectTripFuelLatest = content; sectTripFuelQueue.Enqueue(content); if (sectTripFuelQueue.Count > sectStoreMax) { sectTripFuelQueue.Dequeue(); } }
public void loadTripFuel() { System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(TripFuelContent)); try { System.IO.FileStream fs = new System.IO.FileStream(filePath, System.IO.FileMode.Open); try { totalTripFuel = (TripFuelContent)serializer.Deserialize(fs); } catch (XmlException ex) { Console.WriteLine(ex.Message); this.resetTotalTripFuel(); } fs.Close(); } catch (FileNotFoundException ex) { Console.WriteLine(ex.Message); this.resetTotalTripFuel(); } catch (DirectoryNotFoundException ex) { Console.WriteLine(ex.Message); System.IO.Directory.CreateDirectory(folderPath); this.resetSectTripFuel(); } catch (System.Security.SecurityException ex) { Console.WriteLine(ex.Message); this.resetTotalTripFuel(); } }
public void resetSectTripFuel() { sectTripFuelLatest = new TripFuelContent(); sectTripFuelQueue = new Queue <TripFuelContent> (); }
public void resetTotalTripFuel() { totalTripFuel = new TripFuelContent(); }
/// <summary> /// Update fuel and trip by given parameters. /// (Unused parameters are ignored for calculation) /// </summary> /// <param name="rev">Engine rev (only refered on RPM_INJECTION_PW mode)</param> /// <param name="speed">Vehicle speed.</param> /// <param name="injpulseWdth">Injection pulse width (in ms)(only refered on RPM_INJECTION_PW mode)</param> /// <param name="massAirFlow">Mass air flow (g/s) (only refered on MASS_AIR_FLOW or MASS_AIR_FLOW_AF mode)</param> /// <param name="AFRatio">AF ration (only refered on MASS_AIR_FLOW_AF mode)</param> /// <param name="fuelRate">Fuel rate (L/h) (only refered on FUEL_RATE mode)</param> public void update(double rev, double speed, double injpulseWdth, double massAirFlow, double AFRatio, double fuelRate) { if (!stopWatch.IsRunning) { stopWatch.Start(); return; } stopWatch.Stop(); //get elasped time long stopwatch_elapsed = stopWatch.ElapsedMilliseconds; stopWatch.Reset(); stopWatch.Start(); // Do nothing if the elapsed time below StopWatchMinTick if (stopwatch_elapsed < StopWatchMinTick) { return; } // Invoke timeout exception if the elapsed time over timeout if (stopwatch_elapsed > StopWatchTimeout) { throw new TimeoutException("tacho/speed/injpulse/massAirFlow/AFRatio update span is too large (Timeout)."); } //Calculate momentary trip from speed. momentaryTrip = getMomentaryTrip(stopwatch_elapsed, speed, calculatorOption); //Calculate momentart fuel consumption. switch (calculationMethod) { case FuelCalculationMethod.RPM_INJECTION_PW: momentaryFuelConsumption = FuelCalcualtionFormulas.FuelCalcByRevInjPW(stopwatch_elapsed, rev, injpulseWdth, calculatorOption); break; case FuelCalculationMethod.MASS_AIR_FLOW: momentaryFuelConsumption = FuelCalcualtionFormulas.FuelCalcByMassAir(stopwatch_elapsed, massAirFlow, calculatorOption); break; case FuelCalculationMethod.MASS_AIR_FLOW_AF: momentaryFuelConsumption = FuelCalcualtionFormulas.FuelCalcByAFAndMassAir(stopwatch_elapsed, massAirFlow, AFRatio, calculatorOption); break; case FuelCalculationMethod.FUEL_RATE: momentaryFuelConsumption = fuelRate / 3600; break; } // Add to tolal trip and total fuel. totalTripFuel.trip += momentaryTrip; totalTripFuel.fuelConsumption += momentaryFuelConsumption; // Increase section elapsed timer co sectElapsed += stopwatch_elapsed; // Update sect data. if (sectElapsed < sectSpan) { sectTripFuelTemporary.trip += momentaryTrip; sectTripFuelTemporary.fuelConsumption += momentaryFuelConsumption; } else { enqueueSectTripFuel(sectTripFuelTemporary); sectTripFuelTemporary = new TripFuelContent(); sectElapsed = 0; //Invoke event SectFUELTRIPUpdated(this, EventArgs.Empty); } //Save total fuel and trip to file by saveSpan(default : 5min) if (saveElapsedTime < saveSpan) { saveElapsedTime += stopwatch_elapsed; } else { saveTripFuel(); saveElapsedTime = 0; } }