コード例 #1
0
        public void EvtStop()
        {
            _tdu2Reader.Close();
            _tdu2Reader = null;

            _updateTel.Stop();

            Telemetry = default(GenericDataDefinition);
        }
コード例 #2
0
ファイル: EngineCurve.cs プロジェクト: llenroc/SimTelemetry
        public static double GetTorque(double RPM, double throttle, double boost)
        {
            int BaseEngineCurve = 0x00ADD94C; // TODO: MAP TO SIMULATOR MAPPING

            // get engine torque figures (at this engine RPM)
            // this is directly from memory based engine curves.
            double Rads   = (RPM);
            double Th_L   = 0;
            double Th_H   = 0;
            double Tl_L   = 0;
            double Tl_H   = 0;
            double R_L    = 0;
            double R_H    = 0;
            int    offset = 0;

            double Th_Prev = 0;
            double Tl_Prev = 0;
            double R_Prev  = 0;
            bool   Cached  = ((DoubleList.Count <= 25) ? false : true);

            if (!Cached)
            {
                lock (rf)
                {
                    if (DoubleList.Count > 25)
                    {
                        return(0);
                    }
                    bool rfOpen = false;
                    try
                    {
                        rf.ReadProcess = Process.GetProcessesByName(Telemetry.m.Sim.ProcessName)[0];
                        rf.Open();
                        rfOpen = true;
                        DoubleList.Clear();
                        for (offset = 0; offset < 500; offset++)
                        {
                            double curve_rpm = 0, Tl_Now = 0, Th_Now = 0;
                            // read rpm
                            // TOOD: RFACTOR ONLY
                            // TODO: these operations need to be moved to game DLL's!!!
                            curve_rpm = Rotations.Rads_RPM(rf.ReadDouble(new IntPtr(BaseEngineCurve + 0x8 * 3 * offset)));
                            Tl_Now    = rf.ReadDouble(new IntPtr(BaseEngineCurve + 0x8 * 1 + 0x8 * 3 * offset));
                            Th_Now    = rf.ReadDouble(new IntPtr(BaseEngineCurve + 0x8 * 2 + 0x8 * 3 * offset));

                            DoubleList.Add(curve_rpm);
                            DoubleList.Add(Tl_Now);
                            DoubleList.Add(Th_Now);
                        }
                        Cached = true;
                        offset = 0;
                    }
                    catch (Exception ex)
                    {
                        Cached = false;
                        DoubleList.Clear();
                    }
                    if (rfOpen)
                    {
                        rf.Close();
                    }
                }
            }

            while (Th_H == 0)
            {
                double curve_rpm, Tl_Now, Th_Now;
                curve_rpm = DoubleList[offset * 3];
                Tl_Now    = DoubleList[offset * 3 + 1];
                Th_Now    = DoubleList[offset * 3 + 2];


                if (curve_rpm >= Rads)
                {
                    Th_L = Th_Prev;
                    Th_H = Th_Now;

                    Tl_L = Tl_Prev;
                    Tl_H = Tl_Now;


                    R_H = curve_rpm;
                    R_L = R_Prev;
                    break;
                }

                R_Prev  = curve_rpm;
                Th_Prev = Th_Now;
                Tl_Prev = Tl_Now;
                offset++;
            }
            if (Th_H == 0)
            {
            }
            // calculate duty cycle and determine torque.
            double RPM_Part = (Rads - R_L) / (R_H - R_L); // factor in rpm curve.
            double TorqueH  = Th_L + RPM_Part * (Th_H - Th_L);
            double TorqueL  = Tl_L + RPM_Part * (Tl_H - Tl_L);

            //return TorqueH * throttle * boost + TorqueL * boost;
            return((TorqueH - TorqueL) * throttle * boost + TorqueL);
        }