/// <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;
            }
        }