mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-03 22:48:29 -04:00
8bebf0c394
Convert to IActivate, IDeactivate scheme, thanks andrew add support for rfcomm* interfaces on linux fix guage off screen draw mono issue. remove use of BackStageViewContentPanel andrews spacer changes - not using dues to screen space issue change configpanel constructor to load xml directly remove IMavlink Interface fix hsi off screen draw issue on mono modify hud to use sprite fonts, instead of drawing via GDI+ modify progress reporter to use a 10hz timer to update screen, using invoke/begininvoke fails on mono at 50hz (over 100ms per call). fix targetalt and target airspeed jumping issue. lots of cleanup on tab switching, ie stoping timers/other 3dr radio status led update update ardurover car icon speedup georef image screen. tested on over 1000 images.
184 lines
6.1 KiB
C#
184 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 (!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 ctl.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;
|
|
}
|
|
|
|
}
|
|
}
|