Ejemplo n.º 1
0
        protected override void DoActivate()
        {
            base.DoActivate();

            lbxExports.Items.Clear();
            IDataDefinition ddn = baseNode as IDataDefinition;

            foreach (IDataDefinitionExport export in ddn.Exports)
            {
                lbxExports.Items.Add(export);
            }

            string json = conf.GetConfigurationValue(definition, "");

            if (json != "")
            {
                List <List <string> > rows = JsonConvert.DeserializeObject <List <List <string> > >(json);
                foreach (List <string> row in rows)
                {
                    dgDefinitions.Rows.Add(row.ToArray());
                }

                AvaialbleExports();
            }
        }
Ejemplo n.º 2
0
        public ucCincoSocketEditor(IBaseNode node)
            : base(node)
        {
            InitializeComponent();

            IDataDefinition ddn = node as IDataDefinition;

            foreach (IDataDefinitionExport export in ddn.Exports)
            {
                lbxExports.Items.Add(export);
            }
        }
Ejemplo n.º 3
0
        public double ProvideValue(IApplication app)
        {
            int             radio_selected = (int)(EventSystem.GetDataDefinition("LOCAL:RADIO_SELECTED")?.GetValue()).GetValueOrDefault(0);
            IDataDefinition sourceVal      = null;

            switch (radio_selected)
            {
            case 0: sourceVal = EventSystem.GetDataDefinition("SIMCONNECT:COM STANDBY FREQUENCY:1"); break;

            case 1: sourceVal = EventSystem.GetDataDefinition("SIMCONNECT:COM ACTIVE FREQUENCY:1"); break;

            default: break;
            }
            return((sourceVal?.GetValue()).GetValueOrDefault(0) * 100);
        }
Ejemplo n.º 4
0
        public void CallingRowAddAColumn()
        {
            var expressionMock = new Mock <DeleteDataExpression>();

            var builder = new DeleteDataExpressionBuilder(expressionMock.Object);
            var data    = new { TestColumn = "TestValue" };

            builder.Row(data);

            var             result    = expressionMock.Object;
            IDataDefinition rowobject = result.Rows.First();

            Assert.IsInstanceOf <ReflectedDataDefinition>(rowobject);
            Assert.AreEqual(data, ((ReflectedDataDefinition)rowobject).Data);
        }
Ejemplo n.º 5
0
        public void CallingIsNullAddsANullColumn()
        {
            var expressionMock = new Mock <DeleteDataExpression>();

            var builder = new DeleteDataExpressionBuilder(expressionMock.Object);

            builder.IsNull("TestColumn");

            var             result    = expressionMock.Object;
            IDataDefinition rowobject = result.Rows.First();

            Assert.IsInstanceOf <ExplicitDataDefinition>(rowobject);
            ExplicitDataDefinition rowDefinition = (ExplicitDataDefinition)rowobject;

            rowDefinition.Data.First().ColumnName.ShouldBe("TestColumn");
            rowDefinition.Data.First().Value.ShouldBeNull();
        }
Ejemplo n.º 6
0
        public ucDataObjectEditor(IBaseNode node)
        {
            InitializeComponent();
            _DataObject = node as IDataObject;

            List <IBaseNode> linkedNodes = node.Tree.GetVariables(node);

            foreach (IBaseNode n in linkedNodes)
            {
                lbxLinkedNodes.Items.Add(new ListBoxItem(n));
            }

            foreach (string reference in _DataObject.DataPersistence.DataConnections)
            {
                IBaseNode link = _DataObject.Tree.GetNodeByReference(reference);
                if (link != null)
                {
                    IDataDefinition datadef = link as IDataDefinition;
                    if (datadef != null)
                    {
                        foreach (IDataDefinitionExport export in datadef.Exports)
                        {
                            lbxExports.Items.Add(export);
                        }
                    }
                }
            }

            Root = new TreeNode(Constants.ModelDatasourceMapping);
            Root.SelectedImageIndex = Root.ImageIndex = BLANK_MAPPING;
            tvModelDatasources.Nodes.Add(Root);

            foreach (IMapping mapping in _DataObject.DecisionModelDataSources)
            {
                AddMapping(Root, mapping);
            }

            Root.ExpandAll();
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Returns an <see cref="IEnumerable{T}"/> of <see cref="IDataValue"/> for
        /// the specified <see cref="IDataDefinition"/>
        /// </summary>
        /// <param name="dataDefinition"></param>
        /// <returns></returns>
        public virtual IEnumerable<IDataValue> Evaluate(IDataDefinition dataDefinition)
        {
            var definitionParser = DefinitionParsers.First(dp => dp.Key(dataDefinition));

            return definitionParser.Value(this, dataDefinition);
        }
Ejemplo n.º 8
0
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            var secondaryBackground = Color.Black;

            var g = e.Graphics;
            var r = e.ClipRectangle;

            g.FillRectangle(new SolidBrush(transparant), r);
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.SmoothingMode = SmoothingMode.AntiAlias;

            Point ptSpeedo = new Point(this.Width - this.Height-50, 50);
            Size szSpeedo = new Size(this.Height - 50, this.Height - 50);
            Point ptCenterSpeedo = new Point(ptSpeedo.X + szSpeedo.Width / 2, ptSpeedo.Y + szSpeedo.Height / 2);

            g.FillEllipse(new SolidBrush(secondaryBackground), new Rectangle(new Point(this.Width-this.Height-100, 0), new Size(this.Height+50, this.Height+50)));
            g.FillRectangle(new SolidBrush(secondaryBackground), this.Width-this.Height/2-60, 0, this.Height/2+60,this.Height );
            if (Main.Data == null) return;
            data = Main.Data.Telemetry;
            if (data == null) return;

            var speedoCircleStart = 30.0f;
            var speedoCircleEnd = -210.0f;
            var speedoCircleRange = speedoCircleStart - speedoCircleEnd;

            var speedoMin = 0;
            var speedoMax = Main.Data.Active.Application == "TestDrive2" ? 400 : 120;
            var speedoRange = speedoMax - speedoMin;
            var speedoTick = Main.Data.Active.Application == "TestDrive2" ? 50 : 5;
            var speedoTicks = speedoRange / speedoTick;

            var anglePerSpeedTick = speedoCircleRange / speedoTicks;

            var angleSpeedo = speedoCircleStart + speedoCircleRange * (data.Speed * 3.6 - speedoMin) / (speedoRange);
            angleSpeedo -= 270;
            angleSpeedo += speedoRange;
            var needleSpeedo = RotatePic(needle, (float)angleSpeedo, true);

            // Draw gauge
            Point ptCenterNeedle = new Point(ptSpeedo.X + szSpeedo.Width / 2 - needleSpeedo.Width / 2, ptSpeedo.Y + szSpeedo.Height / 2 - needleSpeedo.Height / 2);
            Rectangle rtSpeedo = new Rectangle(ptSpeedo, szSpeedo);
            Rectangle rtSpeedoInner = new Rectangle(new Point(ptSpeedo.X+3, ptSpeedo.Y+3), new Size(szSpeedo.Width-6, szSpeedo.Height-6));
            var radiusSpeedo = (float) szSpeedo.Width/2.0f;

            g.DrawArc(new Pen(Brushes.White, 3.0f), rtSpeedo, speedoCircleStart, -speedoCircleRange);
            g.DrawArc(new Pen(Brushes.White, 10.0f), rtSpeedo, speedoCircleStart, -speedoCircleRange);
            g.DrawArc(new Pen(Brushes.LightGray, 5.0f), rtSpeedoInner, speedoCircleStart, -speedoCircleRange);

            // Draw speedo
            var i = 0;
            for (var s = speedoCircleEnd; s <= speedoCircleStart; s += anglePerSpeedTick)
            {
                var radius1 = 0;
                var radius2 = radiusSpeedo;
                var radius3 = radiusSpeedo - 20;
                var a = s/360.0 * Math.PI * 2;
                var x1 = radius1 * Math.Cos(a) + ptCenterSpeedo.X;
                var y1 = radius1 * Math.Sin(a) + ptCenterSpeedo.Y;
                var x2 = radius2 * Math.Cos(a) + ptCenterSpeedo.X;
                var y2 = radius2 * Math.Sin(a) + ptCenterSpeedo.Y;
                var x3 = radius3 * Math.Cos(a) + ptCenterSpeedo.X - 10;
                var y3 = radius3 * Math.Sin(a) + ptCenterSpeedo.Y - 10;

                var speedo = speedoMin + speedoTick * i++;
                string speed = speedo.ToString();
                float fontSize, lineSize;
                if (speedo % 20 == 10)
                {
                    x3 += 4.0f;
                    fontSize = 7.0f;
                    lineSize = 3.0f;
                }
                else if (speedo % 20 == 5 || speedo % 20 == 15)
                {
                    lineSize = 1.0f;
                    fontSize = 5.0f;
                }else
                {
                    fontSize = 10.0f;
                    lineSize = 5.0f;
                }
                if (speed.Length == 3) x3 -= 7;

                g.DrawLine(new Pen(secondaryBackground, lineSize), (float)x1, (float)y1, (float)x2, (float)y2);

                // Choose not to draw 10s speed
                if (speedo % 20 != 0 && speedoTick == 5) continue;
                g.DrawString(speed, new Font("Verdana", fontSize, FontStyle.Bold), Brushes.WhiteSmoke, (float)x3, (float)y3);
            }

            // Draw Speedo needle

            double spdNeedleAngle = speedoCircleEnd - speedoCircleRange * (data.Speed*3.6 - speedoMin) / speedoRange;
            spdNeedleAngle += 60;
            spdNeedleAngle = spdNeedleAngle / -180 * Math.PI;
            var spdRad1 = radiusSpeedo;
            var spdRad2 = 0;

            var spdNeedlex1 = spdRad1 * Math.Cos(spdNeedleAngle) + ptCenterSpeedo.X;
            var spdNeedley1 = spdRad1 * Math.Sin(spdNeedleAngle) + ptCenterSpeedo.Y;
            var spdNeedlex2 = spdRad2 * Math.Cos(spdNeedleAngle) + ptCenterSpeedo.X;
            var spdNeedley2 = spdRad2 * Math.Sin(spdNeedleAngle) + ptCenterSpeedo.Y;

            g.DrawLine(new Pen(Brushes.Red, 3.0f), (float)spdNeedlex1, (float)spdNeedley1, (float)spdNeedlex2, (float)spdNeedley2);

            g.DrawImage(needleSpeedo, ptCenterNeedle);

            // Draw RPM

            var engineRpmMax = Main.Data.Active.Application == "TestDrive2" ? (float)Main.Drivetrain.MaximumRpm+1000 : 3000; ;
            var engineRpmMin = 0;
            var engineRpmRange = engineRpmMax - engineRpmMin;
            int engineRpmTick = Main.Data.Active.Application == "TestDrive2" ? 1000 : 250;
            var engineRpmTicks = engineRpmRange / engineRpmTick;

            var rpmCircleStart = -210.0f;
            var rpmCircleEnd = -110.0f;
            var rpmCircleRange = rpmCircleStart - rpmCircleEnd;

            var anglePerRpmTick = rpmCircleRange / engineRpmTicks;

            var rpmOverSize = 40;
            var ptRpm = new Point(ptSpeedo.X - rpmOverSize, ptSpeedo.Y - rpmOverSize);
            var szRpm = new Size(szSpeedo.Width + rpmOverSize*2, szSpeedo.Height + rpmOverSize*2);
            var rtRpm = new Rectangle(ptRpm, szRpm);
            var radiusRpmo = (float) szRpm.Width/2.0f;

            // Draw arc
            i = 0;
            var lastAngle = rpmCircleStart;
            var arcColor = Color.White;
            for (var s = rpmCircleStart; s <= rpmCircleEnd; s -= anglePerRpmTick)
            {
                var rpm = engineRpmMin + engineRpmTick * i;
                i++;
                if (Main.Data.Active.Application == "TestDrive2")
                {
                    if (rpm < Main.Drivetrain.StallRpm+1000)
                        arcColor = Color.Blue;
                    else if (rpm + 1000 > Main.Drivetrain.MaximumRpm)
                        arcColor = Color.Red;
                    else if (rpm > Main.Drivetrain.MaximumRpm)
                        arcColor = Color.DarkRed;
                    else
                    arcColor = Color.White;
                }
                else
                {
                    switch (rpm)
                    {
                        case 0:
                            arcColor = Color.Blue;
                            break;

                        case 750:
                            arcColor = Color.White;
                            break;

                        case 1250:
                            arcColor = Color.Green;
                            break;

                        case 1750:
                            arcColor = Color.WhiteSmoke;
                            break;

                        case 2250:
                            arcColor = Color.Red;
                            break;
                        case 3000:
                            arcColor = Color.DarkRed;
                            break;
                    }
                }
                g.DrawArc(new Pen(arcColor, 4.0f), rtRpm, lastAngle, -anglePerRpmTick);

                lastAngle = s;
            }

            // Draw labels+cutouts
            i = 0;
            for (var s = rpmCircleStart; s <= rpmCircleEnd; s -= anglePerRpmTick )
            {
                var rpm = engineRpmMin + engineRpmTick * i;
                i++;

                var a = s / 360.0 * Math.PI * 2;

                var radius1 = radiusRpmo+5;
                var radius2 = radiusRpmo - 5;

                var radius3 = radiusRpmo-15;

                var x1 = radius1 * Math.Cos(a) + ptCenterSpeedo.X;
                var y1 = radius1 * Math.Sin(a) + ptCenterSpeedo.Y;
                var x2 = radius2 * Math.Cos(a) + ptCenterSpeedo.X;
                var y2 = radius2 * Math.Sin(a) + ptCenterSpeedo.Y;

                var x3 = radius3 * Math.Cos(a) + ptCenterSpeedo.X - 8;
                var y3 = radius3 * Math.Sin(a) + ptCenterSpeedo.Y-8;
                if (rpm % 500 == 0)
                g.DrawString((rpm/100).ToString(), new Font("Verdana", 10.0f, FontStyle.Bold), Brushes.White, (float)x3, (float)y3);

                g.DrawLine(new Pen(secondaryBackground, (rpm % 500 == 0) ? 3.0f : 2.0f), (float)x1, (float)y1, (float)x2, (float)y2);
            }

            double rpmNeedleAngle = rpmCircleStart + rpmCircleRange*(data.EngineRpm - engineRpmMin)/engineRpmRange;
            rpmNeedleAngle +=60;
            rpmNeedleAngle = rpmNeedleAngle/-180*Math.PI;
            var rpmRad1 = radiusRpmo;
            var rpmRad2 = rpmRad1 - 25;

            var rpmNeedlex1 = rpmRad1 * Math.Cos(rpmNeedleAngle) + ptCenterSpeedo.X;
            var rpmNeedley1 = rpmRad1 * Math.Sin(rpmNeedleAngle) + ptCenterSpeedo.Y;
            var rpmNeedlex2 = rpmRad2 * Math.Cos(rpmNeedleAngle) + ptCenterSpeedo.X;
            var rpmNeedley2 = rpmRad2 * Math.Sin(rpmNeedleAngle) + ptCenterSpeedo.Y;

            g.DrawLine(new Pen(Brushes.Orange, 3.0f), (float)rpmNeedlex1, (float)rpmNeedley1, (float)rpmNeedlex2, (float)rpmNeedley2);

            // Draw power gauge

            var enginePwrMax = (float)Main.Drivetrain.CalculateMaxPower();
            var enginePwrMin = 0;
            var enginePwrRange = enginePwrMax - enginePwrMin;
            var enginePwrTick = (enginePwrMax/5);
            enginePwrTick = ((int) enginePwrTick/50)*50;
            var enginePwrTicks = enginePwrRange / enginePwrTick;

            var pwrCircleStart = 30.0f;
            var pwrCircleEnd = 130.0f;
            var pwrCircleRange = pwrCircleStart - pwrCircleEnd;

            var anglePerPwrTick = pwrCircleRange / enginePwrTicks;

            var pwrOverSize = 30;
            var ptpwr = new Point(ptSpeedo.X - pwrOverSize, ptSpeedo.Y - pwrOverSize);
            var szpwr = new Size(szSpeedo.Width + pwrOverSize * 2, szSpeedo.Height + pwrOverSize * 2);
            var rtpwr = new Rectangle(ptpwr, szpwr);
            var radiuspwro = (float)szpwr.Width / 2.0f;

            // Draw arc
            g.DrawArc(new Pen(Color.GreenYellow, 4.0f), rtpwr, pwrCircleStart, pwrCircleRange);

            // Draw labels+cutouts
            i = 0;
            for (var s = pwrCircleStart; s <= pwrCircleEnd; s -= anglePerPwrTick)
            {
                var pwr = enginePwrMin + enginePwrTick * i;
                i++;

                var a = (-s + 60) / 360.0 * Math.PI * 2;

                var radius1 = radiuspwro + 5;
                var radius2 = radiuspwro - 5;

                var radius3 = radiuspwro + 15;

                var x1 = radius1 * Math.Cos(a) + ptCenterSpeedo.X;
                var y1 = radius1 * Math.Sin(a) + ptCenterSpeedo.Y;
                var x2 = radius2 * Math.Cos(a) + ptCenterSpeedo.X;
                var y2 = radius2 * Math.Sin(a) + ptCenterSpeedo.Y;

                var x3 = radius3 * Math.Cos(a) + ptCenterSpeedo.X - 8;
                var y3 = radius3 * Math.Sin(a) + ptCenterSpeedo.Y - 8;

                g.DrawString((pwr).ToString()+"hp", new Font("Verdana", 10.0f, FontStyle.Bold), Brushes.White, (float)x3, (float)y3);

                g.DrawLine(new Pen(secondaryBackground, (pwr % 500 == 0) ? 3.0f : 2.0f), (float)x1, (float)y1, (float)x2, (float)y2);
            }

            var myPwr = Main.Drivetrain.CalculatePower(data.EngineRpm, Main.GetAxisOut(JoyControls.Throttle));
            //if (myPwr < 0) myPwr = 0;
            double pwrNeedleAngle = pwrCircleStart - pwrCircleRange * (myPwr - enginePwrMin) / enginePwrRange;
            pwrNeedleAngle -= 60;
            pwrNeedleAngle = pwrNeedleAngle / -180 * Math.PI;
            var pwrRad1 = radiuspwro;
            var pwrRad2 = pwrRad1 - 25;

            var pwrNeedlex1 = pwrRad1 * Math.Cos(pwrNeedleAngle) + ptCenterSpeedo.X;
            var pwrNeedley1 = pwrRad1 * Math.Sin(pwrNeedleAngle) + ptCenterSpeedo.Y;
            var pwrNeedlex2 = pwrRad2 * Math.Cos(pwrNeedleAngle) + ptCenterSpeedo.X;
            var pwrNeedley2 = pwrRad2 * Math.Sin(pwrNeedleAngle) + ptCenterSpeedo.Y;

            g.DrawLine(new Pen(Brushes.Orange, 3.0f), (float)pwrNeedlex1, (float)pwrNeedley1, (float)pwrNeedlex2, (float)pwrNeedley2);

            // Gear
            var sGear = data.Gear.ToString();
            if (data.Gear == 0) sGear = "N";
            if (data.Gear == -1) sGear = "R";

            g.DrawString(sGear, new Font("Verdana", 14.0f), Brushes.White, ptCenterSpeedo.X-10, 10 );

            // Throttle
            var tWidth = Main.GetAxisOut(JoyControls.Throttle) * 100;
            var bWidth = Main.GetAxisOut(JoyControls.Brake) * 100;
            var cWidth = Main.GetAxisOut(JoyControls.Clutch) * 100;

            g.FillRectangle(new SolidBrush(Color.FromArgb(30,30,30)), ptCenterSpeedo.X-50, this.Height-30, 100, 20);
            g.FillRectangle(new SolidBrush(Color.DarkGreen), ptCenterSpeedo.X - 50, this.Height - 30, (float)tWidth, 10);
            g.FillRectangle(new SolidBrush(Color.DarkRed), ptCenterSpeedo.X - 50, this.Height - 30, (float)bWidth, 10);
            g.FillRectangle(new SolidBrush(Color.Aqua), ptCenterSpeedo.X - 50, this.Height - 20, (float)cWidth, 10);

            var literPerHour = Main.Drivetrain.CalculateFuelConsumption(data.EngineRpm, Main.GetAxisOut(JoyControls.Throttle));
            var kmPerHour = data.Speed*3.6;
            var kmPerLiter = kmPerHour/literPerHour;

            var literPer100KmInst = 100/kmPerLiter;
            if (literPer100Km < 0) literPer100Km = literPer100KmInst;
            else literPer100Km = literPer100KmInst;
            if (literPer100Km > 400) literPer100Km = 400;
            if (literPer100Km < 0) literPer100Km = 0;
            if (!double.IsNaN(literPer100Km) && !double.IsInfinity(literPer100Km))
                literPer100KmAvg = literPer100KmAvg*0.9995 + literPer100Km*0.0005;
            if (double.IsNaN(literPer100KmAvg) || double.IsInfinity(literPer100KmAvg))
                literPer100KmAvg = 0;

            var ets2 = ((Ets2DataMiner) Main.Data.Active);
            var ets2Data = ets2.MyTelemetry;

            var citySrc = ets2Data.Job.CitySource;
            var cityDst = ets2Data.Job.CityDestination;
            var trailer = ets2Data.Job.TrailerName;
            var trailerWeight = ets2Data.Job.Mass/1000.0f;

            var str = ets2Data.Job.TrailerName.Length>2 ? string.Format("Transporting:\r\n{0} from {1} to {2}", trailer, citySrc, cityDst) : "Empty!";

            g.DrawString(str, new Font("Verdana", 8.0f), Brushes.DarkOrange, 0, 170);
            return;

            g.DrawString(literPerHour.ToString("000.00 L/h"), new Font("Verdana", 8.0f), Brushes.DarkOrange, 0, 0);
            g.DrawString(string.Format("1:{0:00.000}km", kmPerLiter), new Font("Verdana", 8.0f), Brushes.DarkOrange, 0, 20);
            g.DrawString(string.Format("{0:00.000}l/100km", literPer100Km), new Font("Verdana", 8.0f), Brushes.DarkOrange, 0, 40);
            g.DrawString(string.Format("{0:00.000}l/100km", literPer100KmAvg), new Font("Verdana", 8.0f), Brushes.DarkOrange, 0, 60);

            g.DrawString(string.Format("{0:000.000}Nm", Main.Drivetrain.CalculateTorqueP(data.EngineRpm, data.Throttle)), new Font("Verdana", 8.0f), Brushes.DarkOrange, 0, 80);
            g.DrawString(string.Format("{0:000.000}Nm", Main.Drivetrain.CalculateTorqueN(data.EngineRpm)), new Font("Verdana", 8.0f), Brushes.DarkOrange, 0, 100);
            g.DrawString(string.Format("{0:000.000}Nm", Main.Drivetrain.CalculateTorqueP(data.EngineRpm, data.Throttle) + Main.Drivetrain.CalculateTorqueN(data.EngineRpm)), new Font("Verdana", 8.0f), Brushes.DarkOrange, 0, 120);

            if (!Main.Data.Telemetry.Paused)
            {
                var scale = 3;
                var dt = DateTime.Now.Subtract(lastCalc).TotalMilliseconds/1000.0*scale;
                DrivenTime += dt;
                DrivenFuel += literPerHour*dt/3600.0;
                DrivenDistance += Math.Abs(data.Speed*dt);
            }
            if (double.IsNaN(DrivenTime) || double.IsInfinity(DrivenTime)) ucDashboard_DoubleClick(null, null);
            if (double.IsNaN(DrivenFuel) || double.IsInfinity(DrivenFuel)) ucDashboard_DoubleClick(null, null);
            if (double.IsNaN(DrivenDistance) || double.IsInfinity(DrivenDistance)) ucDashboard_DoubleClick(null, null);
            var tripStr = "Trip meter: " + (DrivenTime/60).ToString("000.0") + "m / " + (DrivenDistance/1000).ToString("000.00km") + " / " +
                          (DrivenFuel).ToString("000.00L") + "\r\n" +
                          (DrivenFuel/(DrivenDistance/100000)).ToString("000.00") + "l/100km / 1:" + (DrivenDistance/1000/DrivenFuel).ToString("0.00") + "km / " + (DrivenDistance/DrivenTime*3.6).ToString("000.00kmh");
            g.DrawString(tripStr, new Font("Verdana", 10.0f), Brushes.White, 80, 0);
            lastCalc = DateTime.Now;

            //g.DrawString(data.EngineRpm+"rpm", new Font("Arial", 10), Brushes.White, 10, 10 );

               // g.DrawString(myPwr + "HP", new Font("Arial", 10), Brushes.White, 10, 40);
        }
Ejemplo n.º 9
0
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            var secondaryBackground = Color.Black;

            var g = e.Graphics;
            var r = e.ClipRectangle;

            g.FillRectangle(new SolidBrush(transparant), r);
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.SmoothingMode      = SmoothingMode.AntiAlias;

            Point ptSpeedo       = new Point(this.Width - this.Height - 50, 50);
            Size  szSpeedo       = new Size(this.Height - 50, this.Height - 50);
            Point ptCenterSpeedo = new Point(ptSpeedo.X + szSpeedo.Width / 2, ptSpeedo.Y + szSpeedo.Height / 2);

            g.FillEllipse(new SolidBrush(secondaryBackground), new Rectangle(new Point(this.Width - this.Height - 100, 0), new Size(this.Height + 50, this.Height + 50)));
            g.FillRectangle(new SolidBrush(secondaryBackground), this.Width - this.Height / 2 - 60, 0, this.Height / 2 + 60, this.Height);
            if (Main.Data == null)
            {
                return;
            }
            data = Main.Data.Telemetry;
            if (data == null)
            {
                return;
            }

            var speedoCircleStart = 30.0f;
            var speedoCircleEnd   = -210.0f;
            var speedoCircleRange = speedoCircleStart - speedoCircleEnd;

            var speedoMin   = 0;
            var speedoMax   = Main.Data.Active.Application == "TestDrive2" ? 400 : 120;
            var speedoRange = speedoMax - speedoMin;
            var speedoTick  = Main.Data.Active.Application == "TestDrive2" ? 50 : 5;
            var speedoTicks = speedoRange / speedoTick;

            var anglePerSpeedTick = speedoCircleRange / speedoTicks;

            var angleSpeedo = speedoCircleStart + speedoCircleRange * (data.Speed * 3.6 - speedoMin) / (speedoRange);

            angleSpeedo -= 270;
            angleSpeedo += speedoRange;
            var needleSpeedo = RotatePic(needle, (float)angleSpeedo, true);

            // Draw gauge
            Point     ptCenterNeedle = new Point(ptSpeedo.X + szSpeedo.Width / 2 - needleSpeedo.Width / 2, ptSpeedo.Y + szSpeedo.Height / 2 - needleSpeedo.Height / 2);
            Rectangle rtSpeedo       = new Rectangle(ptSpeedo, szSpeedo);
            Rectangle rtSpeedoInner  = new Rectangle(new Point(ptSpeedo.X + 3, ptSpeedo.Y + 3), new Size(szSpeedo.Width - 6, szSpeedo.Height - 6));
            var       radiusSpeedo   = (float)szSpeedo.Width / 2.0f;

            g.DrawArc(new Pen(Brushes.White, 3.0f), rtSpeedo, speedoCircleStart, -speedoCircleRange);
            g.DrawArc(new Pen(Brushes.White, 10.0f), rtSpeedo, speedoCircleStart, -speedoCircleRange);
            g.DrawArc(new Pen(Brushes.LightGray, 5.0f), rtSpeedoInner, speedoCircleStart, -speedoCircleRange);

            // Draw speedo
            var i = 0;

            for (var s = speedoCircleEnd; s <= speedoCircleStart; s += anglePerSpeedTick)
            {
                var radius1 = 0;
                var radius2 = radiusSpeedo;
                var radius3 = radiusSpeedo - 20;
                var a       = s / 360.0 * Math.PI * 2;
                var x1      = radius1 * Math.Cos(a) + ptCenterSpeedo.X;
                var y1      = radius1 * Math.Sin(a) + ptCenterSpeedo.Y;
                var x2      = radius2 * Math.Cos(a) + ptCenterSpeedo.X;
                var y2      = radius2 * Math.Sin(a) + ptCenterSpeedo.Y;
                var x3      = radius3 * Math.Cos(a) + ptCenterSpeedo.X - 10;
                var y3      = radius3 * Math.Sin(a) + ptCenterSpeedo.Y - 10;

                var    speedo = speedoMin + speedoTick * i++;
                string speed = speedo.ToString();
                float  fontSize, lineSize;
                if (speedo % 20 == 10)
                {
                    x3      += 4.0f;
                    fontSize = 7.0f;
                    lineSize = 3.0f;
                }
                else if (speedo % 20 == 5 || speedo % 20 == 15)
                {
                    lineSize = 1.0f;
                    fontSize = 5.0f;
                }
                else
                {
                    fontSize = 10.0f;
                    lineSize = 5.0f;
                }
                if (speed.Length == 3)
                {
                    x3 -= 7;
                }

                g.DrawLine(new Pen(secondaryBackground, lineSize), (float)x1, (float)y1, (float)x2, (float)y2);

                // Choose not to draw 10s speed
                if (speedo % 20 != 0 && speedoTick == 5)
                {
                    continue;
                }
                g.DrawString(speed, new Font("Verdana", fontSize, FontStyle.Bold), Brushes.WhiteSmoke, (float)x3, (float)y3);
            }

            // Draw Speedo needle

            double spdNeedleAngle = speedoCircleEnd - speedoCircleRange * (data.Speed * 3.6 - speedoMin) / speedoRange;

            spdNeedleAngle += 60;
            spdNeedleAngle  = spdNeedleAngle / -180 * Math.PI;
            var spdRad1 = radiusSpeedo;
            var spdRad2 = 0;

            var spdNeedlex1 = spdRad1 * Math.Cos(spdNeedleAngle) + ptCenterSpeedo.X;
            var spdNeedley1 = spdRad1 * Math.Sin(spdNeedleAngle) + ptCenterSpeedo.Y;
            var spdNeedlex2 = spdRad2 * Math.Cos(spdNeedleAngle) + ptCenterSpeedo.X;
            var spdNeedley2 = spdRad2 * Math.Sin(spdNeedleAngle) + ptCenterSpeedo.Y;

            g.DrawLine(new Pen(Brushes.Red, 3.0f), (float)spdNeedlex1, (float)spdNeedley1, (float)spdNeedlex2, (float)spdNeedley2);

            g.DrawImage(needleSpeedo, ptCenterNeedle);

            // Draw RPM

            var engineRpmMax = Main.Data.Active.Application == "TestDrive2" ? (float)Main.Drivetrain.MaximumRpm + 1000 : 3000;

            ;
            var engineRpmMin   = 0;
            var engineRpmRange = engineRpmMax - engineRpmMin;
            int engineRpmTick  = Main.Data.Active.Application == "TestDrive2" ? 1000 : 250;
            var engineRpmTicks = engineRpmRange / engineRpmTick;

            var rpmCircleStart = -210.0f;
            var rpmCircleEnd   = -110.0f;
            var rpmCircleRange = rpmCircleStart - rpmCircleEnd;

            var anglePerRpmTick = rpmCircleRange / engineRpmTicks;

            var rpmOverSize = 40;
            var ptRpm       = new Point(ptSpeedo.X - rpmOverSize, ptSpeedo.Y - rpmOverSize);
            var szRpm       = new Size(szSpeedo.Width + rpmOverSize * 2, szSpeedo.Height + rpmOverSize * 2);
            var rtRpm       = new Rectangle(ptRpm, szRpm);
            var radiusRpmo  = (float)szRpm.Width / 2.0f;

            // Draw arc
            i = 0;
            var lastAngle = rpmCircleStart;
            var arcColor  = Color.White;

            for (var s = rpmCircleStart; s <= rpmCircleEnd; s -= anglePerRpmTick)
            {
                var rpm = engineRpmMin + engineRpmTick * i;
                i++;
                if (Main.Data.Active.Application == "TestDrive2")
                {
                    if (rpm < Main.Drivetrain.StallRpm + 1000)
                    {
                        arcColor = Color.Blue;
                    }
                    else if (rpm + 1000 > Main.Drivetrain.MaximumRpm)
                    {
                        arcColor = Color.Red;
                    }
                    else if (rpm > Main.Drivetrain.MaximumRpm)
                    {
                        arcColor = Color.DarkRed;
                    }
                    else
                    {
                        arcColor = Color.White;
                    }
                }
                else
                {
                    switch (rpm)
                    {
                    case 0:
                        arcColor = Color.Blue;
                        break;

                    case 750:
                        arcColor = Color.White;
                        break;

                    case 1250:
                        arcColor = Color.Green;
                        break;

                    case 1750:
                        arcColor = Color.WhiteSmoke;
                        break;

                    case 2250:
                        arcColor = Color.Red;
                        break;

                    case 3000:
                        arcColor = Color.DarkRed;
                        break;
                    }
                }
                g.DrawArc(new Pen(arcColor, 4.0f), rtRpm, lastAngle, -anglePerRpmTick);

                lastAngle = s;
            }

            // Draw labels+cutouts
            i = 0;
            for (var s = rpmCircleStart; s <= rpmCircleEnd; s -= anglePerRpmTick)
            {
                var rpm = engineRpmMin + engineRpmTick * i;
                i++;

                var a = s / 360.0 * Math.PI * 2;

                var radius1 = radiusRpmo + 5;
                var radius2 = radiusRpmo - 5;

                var radius3 = radiusRpmo - 15;

                var x1 = radius1 * Math.Cos(a) + ptCenterSpeedo.X;
                var y1 = radius1 * Math.Sin(a) + ptCenterSpeedo.Y;
                var x2 = radius2 * Math.Cos(a) + ptCenterSpeedo.X;
                var y2 = radius2 * Math.Sin(a) + ptCenterSpeedo.Y;

                var x3 = radius3 * Math.Cos(a) + ptCenterSpeedo.X - 8;
                var y3 = radius3 * Math.Sin(a) + ptCenterSpeedo.Y - 8;
                if (rpm % 500 == 0)
                {
                    g.DrawString((rpm / 100).ToString(), new Font("Verdana", 10.0f, FontStyle.Bold), Brushes.White, (float)x3, (float)y3);
                }

                g.DrawLine(new Pen(secondaryBackground, (rpm % 500 == 0) ? 3.0f : 2.0f), (float)x1, (float)y1, (float)x2, (float)y2);
            }

            double rpmNeedleAngle = rpmCircleStart + rpmCircleRange * (data.EngineRpm - engineRpmMin) / engineRpmRange;

            rpmNeedleAngle += 60;
            rpmNeedleAngle  = rpmNeedleAngle / -180 * Math.PI;
            var rpmRad1 = radiusRpmo;
            var rpmRad2 = rpmRad1 - 25;

            var rpmNeedlex1 = rpmRad1 * Math.Cos(rpmNeedleAngle) + ptCenterSpeedo.X;
            var rpmNeedley1 = rpmRad1 * Math.Sin(rpmNeedleAngle) + ptCenterSpeedo.Y;
            var rpmNeedlex2 = rpmRad2 * Math.Cos(rpmNeedleAngle) + ptCenterSpeedo.X;
            var rpmNeedley2 = rpmRad2 * Math.Sin(rpmNeedleAngle) + ptCenterSpeedo.Y;

            g.DrawLine(new Pen(Brushes.Orange, 3.0f), (float)rpmNeedlex1, (float)rpmNeedley1, (float)rpmNeedlex2, (float)rpmNeedley2);

            // Draw power gauge

            var enginePwrMax   = (float)Main.Drivetrain.CalculateMaxPower();
            var enginePwrMin   = 0;
            var enginePwrRange = enginePwrMax - enginePwrMin;
            var enginePwrTick  = (enginePwrMax / 5);

            enginePwrTick = ((int)enginePwrTick / 50) * 50;
            var enginePwrTicks = enginePwrRange / enginePwrTick;

            var pwrCircleStart = 30.0f;
            var pwrCircleEnd   = 130.0f;
            var pwrCircleRange = pwrCircleStart - pwrCircleEnd;

            var anglePerPwrTick = pwrCircleRange / enginePwrTicks;

            var pwrOverSize = 30;
            var ptpwr       = new Point(ptSpeedo.X - pwrOverSize, ptSpeedo.Y - pwrOverSize);
            var szpwr       = new Size(szSpeedo.Width + pwrOverSize * 2, szSpeedo.Height + pwrOverSize * 2);
            var rtpwr       = new Rectangle(ptpwr, szpwr);
            var radiuspwro  = (float)szpwr.Width / 2.0f;

            // Draw arc
            g.DrawArc(new Pen(Color.GreenYellow, 4.0f), rtpwr, pwrCircleStart, pwrCircleRange);

            // Draw labels+cutouts
            i = 0;
            for (var s = pwrCircleStart; s <= pwrCircleEnd; s -= anglePerPwrTick)
            {
                var pwr = enginePwrMin + enginePwrTick * i;
                i++;

                var a = (-s + 60) / 360.0 * Math.PI * 2;

                var radius1 = radiuspwro + 5;
                var radius2 = radiuspwro - 5;

                var radius3 = radiuspwro + 15;

                var x1 = radius1 * Math.Cos(a) + ptCenterSpeedo.X;
                var y1 = radius1 * Math.Sin(a) + ptCenterSpeedo.Y;
                var x2 = radius2 * Math.Cos(a) + ptCenterSpeedo.X;
                var y2 = radius2 * Math.Sin(a) + ptCenterSpeedo.Y;

                var x3 = radius3 * Math.Cos(a) + ptCenterSpeedo.X - 8;
                var y3 = radius3 * Math.Sin(a) + ptCenterSpeedo.Y - 8;

                g.DrawString((pwr).ToString() + "hp", new Font("Verdana", 10.0f, FontStyle.Bold), Brushes.White, (float)x3, (float)y3);

                g.DrawLine(new Pen(secondaryBackground, (pwr % 500 == 0) ? 3.0f : 2.0f), (float)x1, (float)y1, (float)x2, (float)y2);
            }

            var myPwr = Main.Drivetrain.CalculatePower(data.EngineRpm, Main.GetAxisOut(JoyControls.Throttle));
            //if (myPwr < 0) myPwr = 0;
            double pwrNeedleAngle = pwrCircleStart - pwrCircleRange * (myPwr - enginePwrMin) / enginePwrRange;

            pwrNeedleAngle -= 60;
            pwrNeedleAngle  = pwrNeedleAngle / -180 * Math.PI;
            var pwrRad1 = radiuspwro;
            var pwrRad2 = pwrRad1 - 25;

            var pwrNeedlex1 = pwrRad1 * Math.Cos(pwrNeedleAngle) + ptCenterSpeedo.X;
            var pwrNeedley1 = pwrRad1 * Math.Sin(pwrNeedleAngle) + ptCenterSpeedo.Y;
            var pwrNeedlex2 = pwrRad2 * Math.Cos(pwrNeedleAngle) + ptCenterSpeedo.X;
            var pwrNeedley2 = pwrRad2 * Math.Sin(pwrNeedleAngle) + ptCenterSpeedo.Y;

            g.DrawLine(new Pen(Brushes.Orange, 3.0f), (float)pwrNeedlex1, (float)pwrNeedley1, (float)pwrNeedlex2, (float)pwrNeedley2);

            // Gear
            var sGear = data.Gear.ToString();

            if (data.Gear == 0)
            {
                sGear = "N";
            }
            if (data.Gear == -1)
            {
                sGear = "R";
            }

            g.DrawString(sGear, new Font("Verdana", 14.0f), Brushes.White, ptCenterSpeedo.X - 10, 10);

            // Throttle
            var tWidth = Main.GetAxisOut(JoyControls.Throttle) * 100;
            var bWidth = Main.GetAxisOut(JoyControls.Brake) * 100;
            var cWidth = Main.GetAxisOut(JoyControls.Clutch) * 100;

            g.FillRectangle(new SolidBrush(Color.FromArgb(30, 30, 30)), ptCenterSpeedo.X - 50, this.Height - 30, 100, 20);
            g.FillRectangle(new SolidBrush(Color.DarkGreen), ptCenterSpeedo.X - 50, this.Height - 30, (float)tWidth, 10);
            g.FillRectangle(new SolidBrush(Color.DarkRed), ptCenterSpeedo.X - 50, this.Height - 30, (float)bWidth, 10);
            g.FillRectangle(new SolidBrush(Color.Aqua), ptCenterSpeedo.X - 50, this.Height - 20, (float)cWidth, 10);

            var literPerHour = Main.Drivetrain.CalculateFuelConsumption(data.EngineRpm, Main.GetAxisOut(JoyControls.Throttle));
            var kmPerHour    = data.Speed * 3.6;
            var kmPerLiter   = kmPerHour / literPerHour;

            var literPer100KmInst = 100 / kmPerLiter;

            if (literPer100Km < 0)
            {
                literPer100Km = literPer100KmInst;
            }
            else
            {
                literPer100Km = literPer100KmInst;
            }
            if (literPer100Km > 400)
            {
                literPer100Km = 400;
            }
            if (literPer100Km < 0)
            {
                literPer100Km = 0;
            }
            if (!double.IsNaN(literPer100Km) && !double.IsInfinity(literPer100Km))
            {
                literPer100KmAvg = literPer100KmAvg * 0.9995 + literPer100Km * 0.0005;
            }
            if (double.IsNaN(literPer100KmAvg) || double.IsInfinity(literPer100KmAvg))
            {
                literPer100KmAvg = 0;
            }

            var ets2     = ((Ets2DataMiner)Main.Data.Active);
            var ets2Data = ets2.MyTelemetry;

            var citySrc       = ets2Data.Job.CitySource;
            var cityDst       = ets2Data.Job.CityDestination;
            var trailer       = ets2Data.Job.TrailerName;
            var trailerWeight = ets2Data.Job.Mass / 1000.0f;

            var str = ets2Data.Job.TrailerName.Length > 2 ? string.Format("Transporting:\r\n{0} from {1} to {2}", trailer, citySrc, cityDst) : "Empty!";

            g.DrawString(str, new Font("Verdana", 8.0f), Brushes.DarkOrange, 0, 170);
            return;

            g.DrawString(literPerHour.ToString("000.00 L/h"), new Font("Verdana", 8.0f), Brushes.DarkOrange, 0, 0);
            g.DrawString(string.Format("1:{0:00.000}km", kmPerLiter), new Font("Verdana", 8.0f), Brushes.DarkOrange, 0, 20);
            g.DrawString(string.Format("{0:00.000}l/100km", literPer100Km), new Font("Verdana", 8.0f), Brushes.DarkOrange, 0, 40);
            g.DrawString(string.Format("{0:00.000}l/100km", literPer100KmAvg), new Font("Verdana", 8.0f), Brushes.DarkOrange, 0, 60);

            g.DrawString(string.Format("{0:000.000}Nm", Main.Drivetrain.CalculateTorqueP(data.EngineRpm, data.Throttle)), new Font("Verdana", 8.0f), Brushes.DarkOrange, 0, 80);
            g.DrawString(string.Format("{0:000.000}Nm", Main.Drivetrain.CalculateTorqueN(data.EngineRpm)), new Font("Verdana", 8.0f), Brushes.DarkOrange, 0, 100);
            g.DrawString(string.Format("{0:000.000}Nm", Main.Drivetrain.CalculateTorqueP(data.EngineRpm, data.Throttle) + Main.Drivetrain.CalculateTorqueN(data.EngineRpm)), new Font("Verdana", 8.0f), Brushes.DarkOrange, 0, 120);

            if (!Main.Data.Telemetry.Paused)
            {
                var scale = 3;
                var dt    = DateTime.Now.Subtract(lastCalc).TotalMilliseconds / 1000.0 * scale;
                DrivenTime     += dt;
                DrivenFuel     += literPerHour * dt / 3600.0;
                DrivenDistance += Math.Abs(data.Speed * dt);
            }
            if (double.IsNaN(DrivenTime) || double.IsInfinity(DrivenTime))
            {
                ucDashboard_DoubleClick(null, null);
            }
            if (double.IsNaN(DrivenFuel) || double.IsInfinity(DrivenFuel))
            {
                ucDashboard_DoubleClick(null, null);
            }
            if (double.IsNaN(DrivenDistance) || double.IsInfinity(DrivenDistance))
            {
                ucDashboard_DoubleClick(null, null);
            }
            var tripStr = "Trip meter: " + (DrivenTime / 60).ToString("000.0") + "m / " + (DrivenDistance / 1000).ToString("000.00km") + " / " + (DrivenFuel).ToString("000.00L") + "\r\n" + (DrivenFuel / (DrivenDistance / 100000)).ToString("000.00") + "l/100km / 1:" + (DrivenDistance / 1000 / DrivenFuel).ToString("0.00") + "km / " + (DrivenDistance / DrivenTime * 3.6).ToString("000.00kmh");

            g.DrawString(tripStr, new Font("Verdana", 10.0f), Brushes.White, 80, 0);
            lastCalc = DateTime.Now;

            //g.DrawString(data.EngineRpm+"rpm", new Font("Arial", 10), Brushes.White, 10, 10 );

            // g.DrawString(myPwr + "HP", new Font("Arial", 10), Brushes.White, 10, 40);
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Returns an <see cref="IEnumerable{T}"/> of <see cref="IDataValue"/> for
        /// the specified <see cref="IDataDefinition"/>
        /// </summary>
        /// <param name="dataDefinition"></param>
        /// <returns></returns>
        public virtual IEnumerable <IDataValue> Evaluate(IDataDefinition dataDefinition)
        {
            var definitionParser = DefinitionParsers.First(dp => dp.Key(dataDefinition));

            return(definitionParser.Value(this, dataDefinition));
        }
Ejemplo n.º 11
0
 public static IEventConditionSimple CreateCondition(IDataDefinition dataSource, SPADEventValueComparator comparator, string targetValue)
 {
     return(EventSystemHandler.CreateCondition(dataSource, comparator, targetValue));
 }