/// <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();
        }
Ejemplo n.º 2
0
        /// <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);
        }