ardupilot/Tools/ArdupilotMegaPlanner/Controls/HSI.cs
Michael Oborne 25bcfdd1e7 Mission Planner 1.2.12
add arduino chip detect
fix apm2,2.5 dialog test
add write timeout. this will stop planner hangs on bad serial devices.
change quickview decimal places to 0.00
fix map clicking issue.
fix wind direction wrapping
add airspeed use
modify firmware screen from Marooned
major flightdata tab change.
add save/load polygon from file
add some error handling dialogs
2012-09-20 07:37:36 +08:00

186 lines
6.1 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace ArdupilotMega.Controls
{
public partial class HSI : UserControl
{
Bitmap _headingimage;
bool drawnheading = false;
int _heading = 0;
int _navbearing = 0;
[System.ComponentModel.Browsable(true)]
public int Heading
{
get { return _heading; }
set { _heading = value; this.Invalidate(); }
}
[System.ComponentModel.Browsable(true)]
public int NavHeading
{
get { return _navbearing; }
set { _navbearing = value; }
}
/// <summary>
/// Override to prevent offscreen drawing the control - mono mac
/// </summary>
public new void Invalidate()
{
if (Disposing)
return;
if (!ThisReallyVisible())
{
return;
}
base.Invalidate();
}
/// <summary>
/// this is to fix a mono off screen drawing issue
/// </summary>
/// <returns></returns>
public bool ThisReallyVisible()
{
//Control ctl = Control.FromHandle(this.Handle);
return this.Visible;
}
public HSI()
{
InitializeComponent();
_headingimage = new Bitmap(this.Width, this.Height);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
int _radiusinside = (int)(Width / 3.6f);
int _radiusoutside = (int)(Width / 2.2f);
// drawnheading = false;
if (drawnheading == false || this.DesignMode)
{
_headingimage = new Bitmap(Width, Height);
Graphics g = Graphics.FromImage(_headingimage);
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bicubic;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
//Graphics g = e.Graphics;
g.TranslateTransform(this.Width/2,this.Height /2);
int font = this.Width / 14;
for (int a = 0; a <= 360; a += 5)
{
if (a == 0)
{
g.DrawString("N".PadLeft(2), new Font(FontFamily.GenericSansSerif, font), Brushes.White, new PointF(-font, -_radiusoutside));
g.DrawLine(Pens.White, 0, _radiusinside, 0, _radiusinside + 11);
}
else if (a == 90)
{
g.DrawString("E".PadLeft(2), new Font(FontFamily.GenericSansSerif, font), Brushes.White, new PointF(-font, -_radiusoutside));
g.DrawLine(Pens.White, 0, _radiusinside, 0, _radiusinside + 11);
}
else if (a == 180)
{
g.DrawString("S".PadLeft(2), new Font(FontFamily.GenericSansSerif, font), Brushes.White, new PointF(-font, -_radiusoutside));
g.DrawLine(Pens.White, 0, _radiusinside, 0, _radiusinside + 11);
}
else if (a == 270)
{
g.DrawString("W".PadLeft(2), new Font(FontFamily.GenericSansSerif, font), Brushes.White, new PointF(-font, -_radiusoutside));
g.DrawLine(Pens.White, 0, _radiusinside, 0, _radiusinside + 11);
}
else if (a == 360)
{
// ignore it, as we process it at 0
}
else if ((a % 30) == 0) // number labeled
{
g.DrawString((a / 10).ToString("0").PadLeft(2), new Font(FontFamily.GenericSansSerif, font), Brushes.White, new PointF(-font, -_radiusoutside));
g.DrawLine(Pens.White, 0, _radiusinside, 0, _radiusinside + 11);
}
else if (a % 10 == 0) // larger line
{
g.DrawLine(Pens.White, 0, _radiusinside, 0, _radiusinside + 7);
}
else if (a % 5 == 0) // small line
{
g.DrawLine(Pens.White, 0, _radiusinside, 0, _radiusinside + 4);
}
g.RotateTransform(5);
}
g.ResetTransform();
drawnheading = true;
}
e.Graphics.TranslateTransform(Width / 2, Height / 2);
e.Graphics.RotateTransform(-Heading);
e.Graphics.DrawImage(_headingimage, new Rectangle(-Width / 2, - Height/2,Width,Height));
e.Graphics.RotateTransform(Heading);
Pen or = new Pen(Color.DarkOrange,2);
// body
e.Graphics.DrawLine(or, 0, 30, 0, -10);
// wing
e.Graphics.DrawLine(or, -30, 0, 30, 0);
//tail
e.Graphics.DrawLine(or, -10, 25, 10, 25);
e.Graphics.DrawLine(new Pen(Color.White,2),0,-_radiusoutside,0,-_radiusinside);
e.Graphics.RotateTransform(NavHeading - Heading);
Point[] headbug = new Point[7];
headbug[0] = new Point(-5, -_radiusoutside + 0);
headbug[1] = new Point(-5, -_radiusoutside + 4);
headbug[2] = new Point(-3, -_radiusoutside + 4);
headbug[3] = new Point(0, -_radiusoutside + 8);
headbug[4] = new Point(3, -_radiusoutside + 4);
headbug[5] = new Point(5, -_radiusoutside + 4);
headbug[6] = new Point(5, -_radiusoutside + 0);
e.Graphics.DrawLines(or, headbug);
// this.Invalidate();
}
protected override void OnResize(EventArgs e)
{
Width = Height;
base.OnResize(e);
this.Invalidate();
drawnheading = false;
}
}
}