mirror of https://github.com/ArduPilot/ardupilot
1219 lines
45 KiB
C#
1219 lines
45 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
using AGaugeApp;
|
|
using System.IO.Ports;
|
|
using System.Threading;
|
|
using ArdupilotMega.Attributes;
|
|
using GMap.NET;
|
|
using GMap.NET.WindowsForms;
|
|
using GMap.NET.WindowsForms.Markers;
|
|
|
|
using System.Security.Cryptography.X509Certificates;
|
|
|
|
using System.Net;
|
|
using System.Net.Sockets;
|
|
using System.Xml; // config file
|
|
using System.Runtime.InteropServices; // dll imports
|
|
using log4net;
|
|
using ZedGraph; // Graphs
|
|
using ArdupilotMega;
|
|
using System.Reflection;
|
|
using ArdupilotMega.Utilities;
|
|
|
|
using System.IO;
|
|
|
|
using System.Drawing.Drawing2D;
|
|
|
|
namespace ArdupilotMega
|
|
{
|
|
/// <summary>
|
|
/// Struct as used in Ardupilot
|
|
/// </summary>
|
|
public struct Locationwp
|
|
{
|
|
public byte id; // command id
|
|
public byte options;
|
|
public float p1; // param 1
|
|
public float p2; // param 2
|
|
public float p3; // param 3
|
|
public float p4; // param 4
|
|
public float lat; // Lattitude * 10**7
|
|
public float lng; // Longitude * 10**7
|
|
public float alt; // Altitude in centimeters (meters * 100)
|
|
};
|
|
|
|
|
|
/// <summary>
|
|
/// used to override the drawing of the waypoint box bounding
|
|
/// </summary>
|
|
public class GMapMarkerRect : GMapMarker
|
|
{
|
|
public Pen Pen = new Pen(Brushes.White, 2);
|
|
|
|
public Color Color { get { return Pen.Color; } set { Pen.Color = value; } }
|
|
|
|
public GMapMarker InnerMarker;
|
|
|
|
public int wprad = 0;
|
|
public GMapControl MainMap;
|
|
|
|
public GMapMarkerRect(PointLatLng p)
|
|
: base(p)
|
|
{
|
|
Pen.DashStyle = DashStyle.Dash;
|
|
|
|
// do not forget set Size of the marker
|
|
// if so, you shall have no event on it ;}
|
|
Size = new System.Drawing.Size(50, 50);
|
|
Offset = new System.Drawing.Point(-Size.Width / 2, -Size.Height / 2 - 20);
|
|
}
|
|
|
|
public override void OnRender(Graphics g)
|
|
{
|
|
base.OnRender(g);
|
|
|
|
if (wprad == 0 || MainMap == null)
|
|
return;
|
|
|
|
// undo autochange in mouse over
|
|
if (Pen.Color == Color.Blue)
|
|
Pen.Color = Color.White;
|
|
|
|
double width = (MainMap.Manager.GetDistance(MainMap.FromLocalToLatLng(0, 0), MainMap.FromLocalToLatLng(MainMap.Width, 0)) * 1000.0);
|
|
double height = (MainMap.Manager.GetDistance(MainMap.FromLocalToLatLng(0, 0), MainMap.FromLocalToLatLng(MainMap.Height, 0)) * 1000.0);
|
|
double m2pixelwidth = MainMap.Width / width;
|
|
double m2pixelheight = MainMap.Height / height;
|
|
|
|
GPoint loc = new GPoint((int)(LocalPosition.X - (m2pixelwidth * wprad * 2)), LocalPosition.Y);// MainMap.FromLatLngToLocal(wpradposition);
|
|
|
|
g.DrawArc(Pen, new System.Drawing.Rectangle(LocalPosition.X - Offset.X - (Math.Abs(loc.X - LocalPosition.X) / 2), LocalPosition.Y - Offset.Y - Math.Abs(loc.X - LocalPosition.X) / 2, Math.Abs(loc.X - LocalPosition.X), Math.Abs(loc.X - LocalPosition.X)), 0, 360);
|
|
|
|
}
|
|
}
|
|
|
|
public class GMapMarkerPlane : GMapMarker
|
|
{
|
|
const float rad2deg = (float)(180 / Math.PI);
|
|
const float deg2rad = (float)(1.0 / rad2deg);
|
|
|
|
static readonly System.Drawing.Size SizeSt = new System.Drawing.Size(global::ArdupilotMega.Properties.Resources.planeicon.Width, global::ArdupilotMega.Properties.Resources.planeicon.Height);
|
|
float heading = 0;
|
|
float cog = -1;
|
|
float target = -1;
|
|
float nav_bearing = -1;
|
|
public GMapControl MainMap;
|
|
|
|
public GMapMarkerPlane(PointLatLng p, float heading, float cog, float nav_bearing,float target, GMapControl map)
|
|
: base(p)
|
|
{
|
|
this.heading = heading;
|
|
this.cog = cog;
|
|
this.target = target;
|
|
this.nav_bearing = nav_bearing;
|
|
Size = SizeSt;
|
|
MainMap = map;
|
|
}
|
|
|
|
public override void OnRender(Graphics g)
|
|
{
|
|
Matrix temp = g.Transform;
|
|
g.TranslateTransform(LocalPosition.X, LocalPosition.Y);
|
|
|
|
g.RotateTransform(-MainMap.Bearing);
|
|
|
|
int length = 500;
|
|
// anti NaN
|
|
try
|
|
{
|
|
g.DrawLine(new Pen(Color.Red, 2), 0.0f, 0.0f, (float)Math.Cos((heading - 90) * deg2rad) * length, (float)Math.Sin((heading - 90) * deg2rad) * length);
|
|
}
|
|
catch { }
|
|
g.DrawLine(new Pen(Color.Green, 2), 0.0f, 0.0f, (float)Math.Cos((nav_bearing - 90) * deg2rad) * length, (float)Math.Sin((nav_bearing - 90) * deg2rad) * length);
|
|
g.DrawLine(new Pen(Color.Black, 2), 0.0f, 0.0f, (float)Math.Cos((cog - 90) * deg2rad) * length, (float)Math.Sin((cog - 90) * deg2rad) * length);
|
|
g.DrawLine(new Pen(Color.Orange, 2), 0.0f, 0.0f, (float)Math.Cos((target - 90) * deg2rad) * length, (float)Math.Sin((target - 90) * deg2rad) * length);
|
|
// anti NaN
|
|
try
|
|
{
|
|
|
|
float desired_lead_dist = 100;
|
|
|
|
|
|
double width = (MainMap.Manager.GetDistance(MainMap.FromLocalToLatLng(0, 0), MainMap.FromLocalToLatLng(MainMap.Width, 0)) * 1000.0);
|
|
double m2pixelwidth = MainMap.Width / width;
|
|
|
|
float alpha = ((desired_lead_dist * (float)m2pixelwidth) / MainV2.cs.radius) * rad2deg;
|
|
|
|
if (MainV2.cs.radius < 0)
|
|
{
|
|
// fixme
|
|
|
|
float p1 = (float)Math.Cos((cog) * deg2rad) * MainV2.cs.radius + MainV2.cs.radius;
|
|
|
|
float p2 = (float)Math.Sin((cog) * deg2rad) * MainV2.cs.radius + MainV2.cs.radius;
|
|
|
|
g.DrawArc(new Pen(Color.HotPink, 2), p1, p2, Math.Abs(MainV2.cs.radius) * 2, Math.Abs(MainV2.cs.radius) * 2, cog, alpha);
|
|
|
|
}
|
|
|
|
else
|
|
{
|
|
// correct
|
|
|
|
float p1 = (float)Math.Cos((cog - 180) * deg2rad) * MainV2.cs.radius + MainV2.cs.radius;
|
|
|
|
float p2 = (float)Math.Sin((cog - 180) * deg2rad) * MainV2.cs.radius + MainV2.cs.radius;
|
|
|
|
g.DrawArc(new Pen(Color.HotPink, 2), -p1, -p2, MainV2.cs.radius * 2, MainV2.cs.radius * 2, cog - 180, alpha);
|
|
}
|
|
|
|
}
|
|
|
|
catch { }
|
|
|
|
|
|
try {
|
|
g.RotateTransform(heading);
|
|
} catch{}
|
|
g.DrawImageUnscaled(global::ArdupilotMega.Properties.Resources.planeicon, global::ArdupilotMega.Properties.Resources.planeicon.Width / -2, global::ArdupilotMega.Properties.Resources.planeicon.Height / -2);
|
|
|
|
g.Transform = temp;
|
|
}
|
|
}
|
|
|
|
|
|
public class GMapMarkerQuad : GMapMarker
|
|
{
|
|
const float rad2deg = (float)(180 / Math.PI);
|
|
const float deg2rad = (float)(1.0 / rad2deg);
|
|
|
|
static readonly System.Drawing.Size SizeSt = new System.Drawing.Size(global::ArdupilotMega.Properties.Resources.quadicon.Width, global::ArdupilotMega.Properties.Resources.quadicon.Height);
|
|
float heading = 0;
|
|
float cog = -1;
|
|
float target = -1;
|
|
|
|
public GMapMarkerQuad(PointLatLng p, float heading, float cog, float target)
|
|
: base(p)
|
|
{
|
|
this.heading = heading;
|
|
this.cog = cog;
|
|
this.target = target;
|
|
Size = SizeSt;
|
|
}
|
|
|
|
public override void OnRender(Graphics g)
|
|
{
|
|
Matrix temp = g.Transform;
|
|
g.TranslateTransform(LocalPosition.X, LocalPosition.Y);
|
|
|
|
int length = 500;
|
|
// anti NaN
|
|
try
|
|
{
|
|
g.DrawLine(new Pen(Color.Red, 2), 0.0f, 0.0f, (float)Math.Cos((heading - 90) * deg2rad) * length, (float)Math.Sin((heading - 90) * deg2rad) * length);
|
|
}
|
|
catch { }
|
|
//g.DrawLine(new Pen(Color.Green, 2), 0.0f, 0.0f, (float)Math.Cos((nav_bearing - 90) * deg2rad) * length, (float)Math.Sin((nav_bearing - 90) * deg2rad) * length);
|
|
g.DrawLine(new Pen(Color.Black, 2), 0.0f, 0.0f, (float)Math.Cos((cog - 90) * deg2rad) * length, (float)Math.Sin((cog - 90) * deg2rad) * length);
|
|
g.DrawLine(new Pen(Color.Orange, 2), 0.0f, 0.0f, (float)Math.Cos((target - 90) * deg2rad) * length, (float)Math.Sin((target - 90) * deg2rad) * length);
|
|
// anti NaN
|
|
try
|
|
{
|
|
g.RotateTransform(heading);
|
|
}
|
|
catch { }
|
|
g.DrawImageUnscaled(global::ArdupilotMega.Properties.Resources.quadicon, global::ArdupilotMega.Properties.Resources.quadicon.Width / -2 + 2, global::ArdupilotMega.Properties.Resources.quadicon.Height / -2);
|
|
|
|
g.Transform = temp;
|
|
}
|
|
}
|
|
|
|
public class PointLatLngAlt
|
|
{
|
|
public double Lat = 0;
|
|
public double Lng = 0;
|
|
public double Alt = 0;
|
|
public string Tag = "";
|
|
public Color color = Color.White;
|
|
|
|
public PointLatLngAlt(double lat, double lng, double alt, string tag)
|
|
{
|
|
this.Lat = lat;
|
|
this.Lng = lng;
|
|
this.Alt = alt;
|
|
this.Tag = tag;
|
|
}
|
|
|
|
public PointLatLngAlt()
|
|
{
|
|
|
|
}
|
|
|
|
public PointLatLngAlt(GMap.NET.PointLatLng pll)
|
|
{
|
|
this.Lat = pll.Lat;
|
|
this.Lng = pll.Lng;
|
|
}
|
|
|
|
public PointLatLngAlt(Locationwp locwp)
|
|
{
|
|
this.Lat = locwp.lat;
|
|
this.Lng = locwp.lng;
|
|
this.Alt = locwp.alt;
|
|
}
|
|
|
|
public PointLatLngAlt(PointLatLngAlt plla)
|
|
{
|
|
this.Lat = plla.Lat;
|
|
this.Lng = plla.Lng;
|
|
this.Alt = plla.Alt;
|
|
this.color = plla.color;
|
|
this.Tag = plla.Tag;
|
|
}
|
|
|
|
public PointLatLng Point()
|
|
{
|
|
return new PointLatLng(Lat, Lng);
|
|
}
|
|
|
|
public override bool Equals(Object pllaobj)
|
|
{
|
|
PointLatLngAlt plla = (PointLatLngAlt)pllaobj;
|
|
|
|
if (plla == null)
|
|
return false;
|
|
|
|
if (this.Lat == plla.Lat &&
|
|
this.Lng == plla.Lng &&
|
|
this.Alt == plla.Alt &&
|
|
this.color == plla.color &&
|
|
this.Tag == plla.Tag)
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
return (int)((Lat + Lng + Alt) * 100);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Calc Distance in M
|
|
/// </summary>
|
|
/// <param name="p2"></param>
|
|
/// <returns>Distance in M</returns>
|
|
public double GetDistance(PointLatLngAlt p2)
|
|
{
|
|
double d = Lat * 0.017453292519943295;
|
|
double num2 = Lng * 0.017453292519943295;
|
|
double num3 = p2.Lat * 0.017453292519943295;
|
|
double num4 = p2.Lng * 0.017453292519943295;
|
|
double num5 = num4 - num2;
|
|
double num6 = num3 - d;
|
|
double num7 = Math.Pow(Math.Sin(num6 / 2.0), 2.0) + ((Math.Cos(d) * Math.Cos(num3)) * Math.Pow(Math.Sin(num5 / 2.0), 2.0));
|
|
double num8 = 2.0 * Math.Atan2(Math.Sqrt(num7), Math.Sqrt(1.0 - num7));
|
|
return (6378.137 * num8) * 1000; // M
|
|
}
|
|
}
|
|
|
|
class NoCheckCertificatePolicy : ICertificatePolicy
|
|
{
|
|
public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
public class Common
|
|
{
|
|
private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
|
public enum distances
|
|
{
|
|
Meters,
|
|
Feet
|
|
}
|
|
|
|
public enum speeds
|
|
{
|
|
ms,
|
|
fps,
|
|
kph,
|
|
mph,
|
|
knots
|
|
}
|
|
|
|
public enum apmmodes
|
|
{
|
|
[DisplayText("Manual")]
|
|
MANUAL = 0,
|
|
[DisplayText("Circle")]
|
|
CIRCLE = 1,
|
|
[DisplayText("Stabilize")]
|
|
STABILIZE = 2,
|
|
[DisplayText("FBW A")]
|
|
FLY_BY_WIRE_A = 5,
|
|
[DisplayText("FBW B")]
|
|
FLY_BY_WIRE_B = 6,
|
|
[DisplayText("Auto")]
|
|
AUTO = 10,
|
|
[DisplayText("RTL")]
|
|
RTL = 11,
|
|
[DisplayText("Loiter")]
|
|
LOITER = 12,
|
|
[DisplayText("Guided")]
|
|
GUIDED = 15
|
|
}
|
|
|
|
public enum ac2modes
|
|
{
|
|
[DisplayText("Stabilize")]
|
|
STABILIZE = 0, // hold level position
|
|
[DisplayText("Acro")]
|
|
ACRO = 1, // rate control
|
|
[DisplayText("Alt Hold")]
|
|
ALT_HOLD = 2, // AUTO control
|
|
[DisplayText("Auto")]
|
|
AUTO = 3, // AUTO control
|
|
[DisplayText("Guided")]
|
|
GUIDED = 4, // AUTO control
|
|
[DisplayText("Loiter")]
|
|
LOITER = 5, // Hold a single location
|
|
[DisplayText("RTL")]
|
|
RTL = 6, // AUTO control
|
|
[DisplayText("Circle")]
|
|
CIRCLE = 7,
|
|
[DisplayText("Pos Hold")]
|
|
POSITION = 8,
|
|
[DisplayText("Land")]
|
|
LAND = 9, // AUTO control
|
|
OF_LOITER = 10,
|
|
[Private(true)]
|
|
APPROACH = 11
|
|
}
|
|
|
|
public enum ac2ch7modes
|
|
{
|
|
[DisplayText("Do Nothing")]
|
|
CH7_DO_NOTHING = 0,
|
|
[DisplayText("Set Hover")]
|
|
CH7_SET_HOVER = 1,
|
|
[DisplayText("Flip")]
|
|
CH7_FLIP = 2,
|
|
[DisplayText("Simple Mode")]
|
|
CH7_SIMPLE_MODE = 3,
|
|
[DisplayText("Return to Launch")]
|
|
CH7_RTL = 4,
|
|
[DisplayText("Automatic Trim")]
|
|
CH7_AUTO_TRIM = 5,
|
|
[DisplayText("ADC Filter")]
|
|
CH7_ADC_FILTER = 6,
|
|
[DisplayText("Save Waypoint")]
|
|
CH7_SAVE_WP = 7
|
|
}
|
|
|
|
public enum ac2ch6modes
|
|
{
|
|
// CH_6 Tuning
|
|
// -----------
|
|
CH6_NONE = 0,
|
|
// Attitude
|
|
CH6_STABILIZE_KP = 1,
|
|
CH6_STABILIZE_KI = 2,
|
|
CH6_YAW_KP = 3,
|
|
// Rate
|
|
CH6_RATE_KP = 4,
|
|
CH6_RATE_KI = 5,
|
|
CH6_RATE_KD = 21,
|
|
CH6_YAW_RATE_KP = 6,
|
|
// Altitude rate controller
|
|
CH6_THROTTLE_KP = 7,
|
|
// Extras
|
|
CH6_TOP_BOTTOM_RATIO = 8,
|
|
CH6_RELAY = 9,
|
|
CH6_TRAVERSE_SPEED = 10,
|
|
|
|
CH6_NAV_P = 11,
|
|
CH6_LOITER_P = 12,
|
|
CH6_HELI_EXTERNAL_GYRO = 13,
|
|
|
|
// altitude controller
|
|
CH6_THR_HOLD_KP = 14,
|
|
CH6_Z_GAIN = 15,
|
|
//CH6_DAMP = 16,
|
|
|
|
// optical flow controller
|
|
CH6_OPTFLOW_KP = 17,
|
|
CH6_OPTFLOW_KI = 18,
|
|
CH6_OPTFLOW_KD = 19,
|
|
|
|
CH6_NAV_I = 20,
|
|
CH6_LOITER_RATE_P = 22,
|
|
CH6_LOITER_RATE_D = 23,
|
|
CH6_YAW_KI = 24,
|
|
CH6_ACRO_KP = 25,
|
|
CH6_YAW_RATE_KD = 26,
|
|
CH6_LOITER_KI = 27,
|
|
CH6_LOITER_RATE_KI = 28,
|
|
CH6_STABILIZE_KD = 29
|
|
}
|
|
|
|
public static void linearRegression()
|
|
{
|
|
double[] values = { 4.8, 4.8, 4.5, 3.9, 4.4, 3.6, 3.6, 2.9, 3.5, 3.0, 2.5, 2.2, 2.6, 2.1, 2.2 };
|
|
|
|
double xAvg = 0;
|
|
double yAvg = 0;
|
|
|
|
for (int x = 0; x < values.Length; x++)
|
|
{
|
|
xAvg += x;
|
|
yAvg += values[x];
|
|
}
|
|
|
|
xAvg = xAvg / values.Length;
|
|
yAvg = yAvg / values.Length;
|
|
|
|
|
|
double v1 = 0;
|
|
double v2 = 0;
|
|
|
|
for (int x = 0; x < values.Length; x++)
|
|
{
|
|
v1 += (x - xAvg) * (values[x] - yAvg);
|
|
v2 += Math.Pow(x - xAvg, 2);
|
|
}
|
|
|
|
double a = v1 / v2;
|
|
double b = yAvg - a * xAvg;
|
|
|
|
log.Debug("y = ax + b");
|
|
log.DebugFormat("a = {0}, the slope of the trend line.", Math.Round(a, 2));
|
|
log.DebugFormat("b = {0}, the intercept of the trend line.", Math.Round(b, 2));
|
|
|
|
//Console.ReadLine();
|
|
}
|
|
|
|
#if MAVLINK10
|
|
|
|
public static bool translateMode(string modein, ref MAVLink.mavlink_set_mode_t mode)
|
|
{
|
|
//MAVLink.mavlink_set_mode_t mode = new MAVLink.mavlink_set_mode_t();
|
|
mode.target_system = MainV2.comPort.sysid;
|
|
|
|
try
|
|
{
|
|
if (Common.getModes() == typeof(Common.apmmodes))
|
|
{
|
|
switch (EnumTranslator.GetValue<Common.apmmodes>(modein))
|
|
{
|
|
case (int)Common.apmmodes.MANUAL:
|
|
case (int)Common.apmmodes.CIRCLE:
|
|
case (int)Common.apmmodes.STABILIZE:
|
|
case (int)Common.apmmodes.AUTO:
|
|
case (int)Common.apmmodes.RTL:
|
|
case (int)Common.apmmodes.LOITER:
|
|
case (int)Common.apmmodes.FLY_BY_WIRE_A:
|
|
case (int)Common.apmmodes.FLY_BY_WIRE_B:
|
|
mode.base_mode = (byte)MAVLink.MAV_MODE_FLAG.CUSTOM_MODE_ENABLED;
|
|
mode.custom_mode = (uint)EnumTranslator.GetValue<Common.apmmodes>(modein);
|
|
break;
|
|
default:
|
|
MessageBox.Show("No Mode Changed " + modein);
|
|
return false;
|
|
}
|
|
}
|
|
else if (Common.getModes() == typeof(Common.ac2modes))
|
|
{
|
|
switch (EnumTranslator.GetValue<Common.ac2modes>(modein))
|
|
{
|
|
case (int)Common.ac2modes.STABILIZE:
|
|
case (int)Common.ac2modes.AUTO:
|
|
case (int)Common.ac2modes.RTL:
|
|
case (int)Common.ac2modes.LOITER:
|
|
case (int)Common.ac2modes.ACRO:
|
|
case (int)Common.ac2modes.ALT_HOLD:
|
|
case (int)Common.ac2modes.CIRCLE:
|
|
case (int)Common.ac2modes.POSITION:
|
|
mode.base_mode = (byte)MAVLink.MAV_MODE_FLAG.CUSTOM_MODE_ENABLED;
|
|
mode.custom_mode = (uint)EnumTranslator.GetValue<Common.ac2modes>(modein);
|
|
break;
|
|
default:
|
|
MessageBox.Show("No Mode Changed " + modein);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
catch { System.Windows.Forms.MessageBox.Show("Failed to find Mode"); return false; }
|
|
|
|
return true;
|
|
}
|
|
|
|
#else
|
|
public static bool translateMode(string modein, ref MAVLink.mavlink_set_nav_mode_t navmode, ref MAVLink.mavlink_set_mode_t mode)
|
|
{
|
|
|
|
//MAVLink.mavlink_set_nav_mode_t navmode = new MAVLink.mavlink_set_nav_mode_t();
|
|
navmode.target = MainV2.comPort.sysid;
|
|
navmode.nav_mode = 255;
|
|
|
|
//MAVLink.mavlink_set_mode_t mode = new MAVLink.mavlink_set_mode_t();
|
|
mode.target = MainV2.comPort.sysid;
|
|
|
|
try
|
|
{
|
|
if (Common.getModes() == typeof(Common.apmmodes))
|
|
{
|
|
switch (EnumTranslator.GetValue<Common.apmmodes>(modein))
|
|
{
|
|
case (int)Common.apmmodes.MANUAL:
|
|
mode.mode = (byte)MAVLink.MAV_MODE.MAV_MODE_MANUAL;
|
|
break;
|
|
case (int)Common.apmmodes.GUIDED:
|
|
mode.mode = (byte)MAVLink.MAV_MODE.MAV_MODE_GUIDED;
|
|
break;
|
|
case (int)Common.apmmodes.STABILIZE:
|
|
mode.mode = (byte)MAVLink.MAV_MODE.MAV_MODE_TEST1;
|
|
break;
|
|
// AUTO MODES
|
|
case (int)Common.apmmodes.AUTO:
|
|
navmode.nav_mode = (byte)MAVLink.MAV_NAV.MAV_NAV_WAYPOINT;
|
|
mode.mode = (byte)MAVLink.MAV_MODE.MAV_MODE_AUTO;
|
|
break;
|
|
case (int)Common.apmmodes.RTL:
|
|
navmode.nav_mode = (byte)MAVLink.MAV_NAV.MAV_NAV_RETURNING;
|
|
mode.mode = (byte)MAVLink.MAV_MODE.MAV_MODE_AUTO;
|
|
break;
|
|
case (int)Common.apmmodes.LOITER:
|
|
navmode.nav_mode = (byte)MAVLink.MAV_NAV.MAV_NAV_LOITER;
|
|
mode.mode = (byte)MAVLink.MAV_MODE.MAV_MODE_AUTO;
|
|
break;
|
|
// FBW
|
|
case (int)Common.apmmodes.FLY_BY_WIRE_A:
|
|
navmode.nav_mode = (byte)1;
|
|
mode.mode = (byte)MAVLink.MAV_MODE.MAV_MODE_TEST2;
|
|
break;
|
|
case (int)Common.apmmodes.FLY_BY_WIRE_B:
|
|
navmode.nav_mode = (byte)2;
|
|
mode.mode = (byte)MAVLink.MAV_MODE.MAV_MODE_TEST2;
|
|
break;
|
|
default:
|
|
CustomMessageBox.Show("No Mode Changed " + modein);
|
|
return false;
|
|
}
|
|
}
|
|
else if (Common.getModes() == typeof(Common.ac2modes))
|
|
{
|
|
switch (EnumTranslator.GetValue<Common.ac2modes>(modein))
|
|
{
|
|
case (int)Common.ac2modes.GUIDED:
|
|
mode.mode = (byte)MAVLink.MAV_MODE.MAV_MODE_GUIDED;
|
|
break;
|
|
case (int)Common.ac2modes.STABILIZE:
|
|
mode.mode = (byte)MAVLink.MAV_MODE.MAV_MODE_MANUAL;
|
|
break;
|
|
// AUTO MODES
|
|
case (int)Common.ac2modes.AUTO:
|
|
navmode.nav_mode = (byte)MAVLink.MAV_NAV.MAV_NAV_WAYPOINT;
|
|
mode.mode = (byte)MAVLink.MAV_MODE.MAV_MODE_AUTO;
|
|
break;
|
|
case (int)Common.ac2modes.RTL:
|
|
navmode.nav_mode = (byte)MAVLink.MAV_NAV.MAV_NAV_RETURNING;
|
|
mode.mode = (byte)MAVLink.MAV_MODE.MAV_MODE_AUTO;
|
|
break;
|
|
case (int)Common.ac2modes.LOITER:
|
|
navmode.nav_mode = (byte)MAVLink.MAV_NAV.MAV_NAV_LOITER;
|
|
mode.mode = (byte)MAVLink.MAV_MODE.MAV_MODE_AUTO;
|
|
break;
|
|
default:
|
|
CustomMessageBox.Show("No Mode Changed " + modein);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
catch { System.Windows.Forms.CustomMessageBox.Show("Failed to find Mode"); return false; }
|
|
|
|
return true;
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
public static bool getFilefromNet(string url,string saveto) {
|
|
try
|
|
{
|
|
// this is for mono to a ssl server
|
|
//ServicePointManager.CertificatePolicy = new NoCheckCertificatePolicy();
|
|
|
|
ServicePointManager.ServerCertificateValidationCallback =
|
|
new System.Net.Security.RemoteCertificateValidationCallback((sender, certificate, chain, policyErrors) => { return true; });
|
|
|
|
// Create a request using a URL that can receive a post.
|
|
WebRequest request = WebRequest.Create(url);
|
|
request.Timeout = 10000;
|
|
// Set the Method property of the request to POST.
|
|
request.Method = "GET";
|
|
// Get the response.
|
|
WebResponse response = request.GetResponse();
|
|
// Display the status.
|
|
log.Info(((HttpWebResponse)response).StatusDescription);
|
|
if (((HttpWebResponse)response).StatusCode != HttpStatusCode.OK)
|
|
return false;
|
|
// Get the stream containing content returned by the server.
|
|
Stream dataStream = response.GetResponseStream();
|
|
|
|
long bytes = response.ContentLength;
|
|
long contlen = bytes;
|
|
|
|
byte[] buf1 = new byte[1024];
|
|
|
|
FileStream fs = new FileStream(saveto + ".new", FileMode.Create);
|
|
|
|
DateTime dt = DateTime.Now;
|
|
|
|
while (dataStream.CanRead && bytes > 0)
|
|
{
|
|
Application.DoEvents();
|
|
log.Debug(saveto + " " + bytes);
|
|
int len = dataStream.Read(buf1, 0, buf1.Length);
|
|
bytes -= len;
|
|
fs.Write(buf1, 0, len);
|
|
}
|
|
|
|
fs.Close();
|
|
dataStream.Close();
|
|
response.Close();
|
|
|
|
File.Delete(saveto);
|
|
File.Move(saveto + ".new", saveto);
|
|
|
|
return true;
|
|
}
|
|
catch (Exception ex) { log.Info("getFilefromNet(): " + ex.ToString()); return false; }
|
|
}
|
|
|
|
public static Type getModes()
|
|
{
|
|
if (MainV2.cs.firmware == MainV2.Firmwares.ArduPlane)
|
|
{
|
|
return typeof(apmmodes);
|
|
}
|
|
else if (MainV2.cs.firmware == MainV2.Firmwares.ArduCopter2)
|
|
{
|
|
return typeof(ac2modes);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public static List<KeyValuePair<int,string>> getModesList()
|
|
{
|
|
if (MainV2.cs.firmware == MainV2.Firmwares.ArduPlane)
|
|
{
|
|
var flightModes = EnumTranslator.Translate<apmmodes>();
|
|
return flightModes.ToList();
|
|
}
|
|
else if (MainV2.cs.firmware == MainV2.Firmwares.ArduCopter2)
|
|
{
|
|
var flightModes = EnumTranslator.Translate<ac2modes>();
|
|
return flightModes.ToList();
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public static Form LoadingBox(string title, string promptText)
|
|
{
|
|
Form form = new Form();
|
|
System.Windows.Forms.Label label = new System.Windows.Forms.Label();
|
|
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainV2));
|
|
form.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
|
|
|
form.Text = title;
|
|
label.Text = promptText;
|
|
|
|
label.SetBounds(9, 50, 372, 13);
|
|
|
|
label.AutoSize = true;
|
|
|
|
form.ClientSize = new Size(396, 107);
|
|
form.Controls.AddRange(new Control[] { label });
|
|
form.ClientSize = new Size(Math.Max(300, label.Right + 10), form.ClientSize.Height);
|
|
form.FormBorderStyle = FormBorderStyle.FixedDialog;
|
|
form.StartPosition = FormStartPosition.CenterScreen;
|
|
form.MinimizeBox = false;
|
|
form.MaximizeBox = false;
|
|
|
|
ThemeManager.ApplyThemeTo(form);
|
|
|
|
form.Show();
|
|
form.Refresh();
|
|
label.Refresh();
|
|
Application.DoEvents();
|
|
return form;
|
|
}
|
|
|
|
public static DialogResult MessageShowAgain(string title, string promptText)
|
|
{
|
|
Form form = new Form();
|
|
System.Windows.Forms.Label label = new System.Windows.Forms.Label();
|
|
CheckBox chk = new CheckBox();
|
|
ArdupilotMega.Controls.MyButton buttonOk = new ArdupilotMega.Controls.MyButton();
|
|
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainV2));
|
|
form.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
|
|
|
form.Text = title;
|
|
label.Text = promptText;
|
|
|
|
chk.Tag = ("SHOWAGAIN_" + title.Replace(" ","_"));
|
|
chk.AutoSize = true;
|
|
chk.Text = "Show me again?";
|
|
chk.Checked = true;
|
|
chk.Location = new Point(9,80);
|
|
|
|
if (MainV2.config[(string)chk.Tag] != null && (string)MainV2.config[(string)chk.Tag] == "False") // skip it
|
|
{
|
|
form.Dispose();
|
|
chk.Dispose();
|
|
buttonOk.Dispose();
|
|
label.Dispose();
|
|
return DialogResult.OK;
|
|
}
|
|
|
|
chk.CheckStateChanged += new EventHandler(chk_CheckStateChanged);
|
|
|
|
buttonOk.Text = "OK";
|
|
buttonOk.DialogResult = DialogResult.OK;
|
|
buttonOk.Location = new Point(form.Right - 100 ,80);
|
|
|
|
label.SetBounds(9, 40, 372, 13);
|
|
|
|
label.AutoSize = true;
|
|
|
|
form.ClientSize = new Size(396, 107);
|
|
form.Controls.AddRange(new Control[] { label, chk, buttonOk });
|
|
form.ClientSize = new Size(Math.Max(300, label.Right + 10), form.ClientSize.Height);
|
|
form.FormBorderStyle = FormBorderStyle.FixedDialog;
|
|
form.StartPosition = FormStartPosition.CenterScreen;
|
|
form.MinimizeBox = false;
|
|
form.MaximizeBox = false;
|
|
|
|
ThemeManager.ApplyThemeTo(form);
|
|
|
|
DialogResult dialogResult =form.ShowDialog();
|
|
|
|
form.Dispose();
|
|
|
|
return dialogResult;
|
|
}
|
|
|
|
static void chk_CheckStateChanged(object sender, EventArgs e)
|
|
{
|
|
MainV2.config[(string)((CheckBox)(sender)).Tag] = ((CheckBox)(sender)).Checked.ToString();
|
|
}
|
|
|
|
//from http://www.csharp-examples.net/inputbox/
|
|
public static DialogResult InputBox(string title, string promptText, ref string value)
|
|
{
|
|
Form form = new Form();
|
|
System.Windows.Forms.Label label = new System.Windows.Forms.Label();
|
|
TextBox textBox = new TextBox();
|
|
ArdupilotMega.Controls.MyButton buttonOk = new ArdupilotMega.Controls.MyButton();
|
|
ArdupilotMega.Controls.MyButton buttonCancel = new ArdupilotMega.Controls.MyButton();
|
|
|
|
form.TopMost = true;
|
|
|
|
form.Text = title;
|
|
label.Text = promptText;
|
|
textBox.Text = value;
|
|
|
|
buttonOk.Text = "OK";
|
|
buttonCancel.Text = "Cancel";
|
|
buttonOk.DialogResult = DialogResult.OK;
|
|
buttonCancel.DialogResult = DialogResult.Cancel;
|
|
|
|
label.SetBounds(9, 20, 372, 13);
|
|
textBox.SetBounds(12, 36, 372, 20);
|
|
buttonOk.SetBounds(228, 72, 75, 23);
|
|
buttonCancel.SetBounds(309, 72, 75, 23);
|
|
|
|
label.AutoSize = true;
|
|
textBox.Anchor = textBox.Anchor | AnchorStyles.Right;
|
|
buttonOk.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
|
|
buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
|
|
|
|
form.ClientSize = new Size(396, 107);
|
|
form.Controls.AddRange(new Control[] { label, textBox, buttonOk, buttonCancel });
|
|
form.ClientSize = new Size(Math.Max(300, label.Right + 10), form.ClientSize.Height);
|
|
form.FormBorderStyle = FormBorderStyle.FixedDialog;
|
|
form.StartPosition = FormStartPosition.CenterScreen;
|
|
form.MinimizeBox = false;
|
|
form.MaximizeBox = false;
|
|
form.AcceptButton = buttonOk;
|
|
form.CancelButton = buttonCancel;
|
|
|
|
ThemeManager.ApplyThemeTo(form);
|
|
|
|
DialogResult dialogResult = DialogResult.Cancel;
|
|
|
|
dialogResult = form.ShowDialog();
|
|
|
|
if (dialogResult == DialogResult.OK)
|
|
{
|
|
value = textBox.Text;
|
|
}
|
|
|
|
form.Dispose();
|
|
|
|
return dialogResult;
|
|
}
|
|
|
|
public static string speechConversion(string input)
|
|
{
|
|
if (MainV2.cs.wpno == 0)
|
|
{
|
|
input = input.Replace("{wpn}", "Home");
|
|
}
|
|
else
|
|
{
|
|
input = input.Replace("{wpn}", MainV2.cs.wpno.ToString());
|
|
}
|
|
|
|
input = input.Replace("{asp}", MainV2.cs.airspeed.ToString("0"));
|
|
|
|
input = input.Replace("{alt}", MainV2.cs.alt.ToString("0"));
|
|
|
|
input = input.Replace("{wpa}", MainV2.cs.targetalt.ToString("0"));
|
|
|
|
input = input.Replace("{gsp}", MainV2.cs.groundspeed.ToString("0"));
|
|
|
|
input = input.Replace("{mode}", MainV2.cs.mode.ToString());
|
|
|
|
input = input.Replace("{batv}", MainV2.cs.battery_voltage.ToString("0.00"));
|
|
|
|
return input;
|
|
}
|
|
}
|
|
|
|
public class VerticalProgressBar : HorizontalProgressBar
|
|
{
|
|
protected override CreateParams CreateParams
|
|
{
|
|
get
|
|
{
|
|
CreateParams cp = base.CreateParams;
|
|
cp.Style |= 0x04;
|
|
return cp;
|
|
}
|
|
}
|
|
}
|
|
|
|
public class VerticalProgressBar2 : HorizontalProgressBar2
|
|
{
|
|
protected override void OnPaint(PaintEventArgs e)
|
|
{
|
|
e.Graphics.TranslateTransform(0, e.Graphics.ClipBounds.Height);
|
|
e.Graphics.RotateTransform(270);
|
|
e.Graphics.ScaleTransform((float)this.Height / (float)this.Width, (float)this.Width / (float)this.Height);
|
|
base.OnPaint(e);
|
|
}
|
|
}
|
|
|
|
public class HorizontalProgressBar2 : BSE.Windows.Forms.ProgressBar
|
|
{
|
|
private string m_Text;
|
|
int offset = 0;
|
|
int _min = 0;
|
|
int _max = 0;
|
|
int _value = 0;
|
|
System.Windows.Forms.Label lbl1 = new System.Windows.Forms.Label();
|
|
System.Windows.Forms.Label lbl = new System.Windows.Forms.Label();
|
|
public bool reverse = false;
|
|
int displayvalue = 0;
|
|
|
|
public HorizontalProgressBar2()
|
|
: base()
|
|
{
|
|
}
|
|
|
|
public new int Value
|
|
{
|
|
get { return _value; }
|
|
set
|
|
{
|
|
if (_value == value)
|
|
return;
|
|
_value = value;
|
|
displayvalue = _value;
|
|
|
|
if (reverse)
|
|
{
|
|
int dif = _value - Minimum;
|
|
_value = Maximum - dif;
|
|
}
|
|
|
|
int ans = _value + offset;
|
|
if (ans <= base.Minimum)
|
|
{
|
|
ans = base.Minimum + 1; // prevent an exception for the -1 hack
|
|
}
|
|
else if (ans >= base.Maximum)
|
|
{
|
|
ans = base.Maximum;
|
|
}
|
|
|
|
base.Value = ans;
|
|
|
|
if (this.DesignMode) return;
|
|
|
|
if (this.Parent != null)
|
|
{
|
|
this.Parent.Controls.Add(lbl);
|
|
this.Parent.Controls.Add(lbl1);
|
|
}
|
|
}
|
|
}
|
|
|
|
public new int Minimum
|
|
{
|
|
get { return _min; }
|
|
set
|
|
{
|
|
_min = value;
|
|
if (_min < 0)
|
|
{
|
|
base.Minimum = 0; offset = (_max - value) / 2; base.Maximum = _max - value;
|
|
}
|
|
else
|
|
{
|
|
base.Minimum = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
public new int Maximum { get { return _max; } set { _max = value; base.Maximum = value; } }
|
|
|
|
[System.ComponentModel.Browsable(true),
|
|
System.ComponentModel.Category("Mine"),
|
|
System.ComponentModel.Description("Text under Bar")]
|
|
public string Label
|
|
{
|
|
get
|
|
{
|
|
return m_Text;
|
|
}
|
|
set
|
|
{
|
|
if (m_Text != value)
|
|
{
|
|
m_Text = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void drawlbl(Graphics e)
|
|
{
|
|
lbl.Location = new Point(this.Location.X, this.Location.Y + this.Height + 2);
|
|
lbl.ClientSize = new Size(this.Width, 13);
|
|
lbl.TextAlign = ContentAlignment.MiddleCenter;
|
|
lbl.Text = m_Text;
|
|
|
|
lbl1.Location = new Point(this.Location.X, this.Location.Y + this.Height + 15);
|
|
lbl1.ClientSize = new Size(this.Width, 13);
|
|
lbl1.TextAlign = ContentAlignment.MiddleCenter;
|
|
lbl1.Text = displayvalue.ToString();
|
|
|
|
if (minline != 0 && maxline != 0)
|
|
{
|
|
float range = this.Maximum - this.Minimum;
|
|
float range2 = this.Width;
|
|
Pen redPen = new Pen(Color.Red, 2);
|
|
|
|
SolidBrush mybrush = new SolidBrush(Color.FromArgb(0x40, 0x57, 0x04));
|
|
|
|
if ((Type)this.GetType() == typeof(VerticalProgressBar2)) {
|
|
e.ResetTransform();
|
|
range2 = this.Height;
|
|
if (reverse)
|
|
{
|
|
e.DrawLine(redPen, 0, (maxline - this.Minimum) / range * range2 + 0, this.Width, (maxline - this.Minimum) / range * range2 + 0);
|
|
e.DrawLine(redPen, 0, (minline - this.Minimum) / range * range2 + 6, this.Width, (minline - this.Minimum) / range * range2 + 6);
|
|
e.DrawString(maxline.ToString(), SystemFonts.DefaultFont, mybrush, 5, (maxline - this.Minimum) / range * range2 + 2);
|
|
e.DrawString(minline.ToString(), SystemFonts.DefaultFont, Brushes.White, 5, (minline - this.Minimum) / range * range2 - 10);
|
|
}
|
|
else
|
|
{
|
|
e.DrawLine(redPen, 0, (this.Maximum - minline) / range * range2 + 0, this.Width, (this.Maximum - minline) / range * range2 + 0);
|
|
e.DrawLine(redPen, 0, (this.Maximum - maxline) / range * range2 + 6, this.Width, (this.Maximum - maxline) / range * range2 + 6);
|
|
e.DrawString(minline.ToString(), SystemFonts.DefaultFont, mybrush, 5, (this.Maximum - minline) / range * range2 + 2);
|
|
e.DrawString(maxline.ToString(), SystemFonts.DefaultFont, Brushes.White, 5, (this.Maximum - maxline) / range * range2 - 10);
|
|
}
|
|
} else {
|
|
if (reverse)
|
|
{
|
|
e.DrawLine(redPen, (this.Maximum - minline) / range * range2 - 0, 0, (this.Maximum - minline) / range * range2 - 0, this.Height);
|
|
e.DrawLine(redPen, (this.Maximum - maxline) / range * range2 - 0, 0, (this.Maximum - maxline) / range * range2 - 0, this.Height);
|
|
e.DrawString(minline.ToString(), SystemFonts.DefaultFont, mybrush, (this.Maximum - minline) / range * range2 - 30, 5);
|
|
e.DrawString(maxline.ToString(), SystemFonts.DefaultFont, Brushes.White, (this.Maximum - maxline) / range * range2 - 0, 5);
|
|
}
|
|
else
|
|
{
|
|
e.DrawLine(redPen, (minline - this.Minimum) / range * range2 - 0, 0, (minline - this.Minimum) / range * range2 - 0, this.Height);
|
|
e.DrawLine(redPen, (maxline - this.Minimum) / range * range2 - 0, 0, (maxline - this.Minimum) / range * range2 - 0, this.Height);
|
|
e.DrawString(minline.ToString(), SystemFonts.DefaultFont, mybrush, (minline - this.Minimum) / range * range2 - 30, 5);
|
|
e.DrawString(maxline.ToString(), SystemFonts.DefaultFont, Brushes.White, (maxline - this.Minimum) / range * range2 - 0, 5);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public int minline { get; set; }
|
|
public int maxline { get; set; }
|
|
|
|
protected override void OnPaint(PaintEventArgs e)
|
|
{
|
|
base.OnPaint(e);
|
|
drawlbl(e.Graphics);
|
|
}
|
|
|
|
}
|
|
|
|
public class HorizontalProgressBar : ProgressBar
|
|
{
|
|
private string m_Text;
|
|
int offset = 0;
|
|
int _min = 0;
|
|
int _max = 0;
|
|
int _value = 0;
|
|
System.Windows.Forms.Label lbl1 = new System.Windows.Forms.Label();
|
|
System.Windows.Forms.Label lbl = new System.Windows.Forms.Label();
|
|
|
|
|
|
public HorizontalProgressBar()
|
|
: base()
|
|
{
|
|
drawlbl();
|
|
//this.Parent.Controls.AddRange(new Control[] { lbl, lbl1 });
|
|
}
|
|
|
|
public new int Value
|
|
{
|
|
get { return _value; }
|
|
set
|
|
{
|
|
_value = value;
|
|
int ans = value + offset;
|
|
if (ans <= base.Minimum)
|
|
{
|
|
ans = base.Minimum + 1; // prevent an exception for the -1 hack
|
|
}
|
|
else if (ans >= base.Maximum)
|
|
{
|
|
ans = base.Maximum;
|
|
}
|
|
base.Value = ans;
|
|
drawlbl();
|
|
base.Value = ans - 1;
|
|
drawlbl();
|
|
base.Value = ans;
|
|
drawlbl();
|
|
}
|
|
}
|
|
|
|
public new int Minimum
|
|
{
|
|
get { return _min; }
|
|
set
|
|
{
|
|
_min = value;
|
|
if (_min < 0)
|
|
{
|
|
base.Minimum = 0; offset = (_max - value) / 2; base.Maximum = _max - value;
|
|
}
|
|
else
|
|
{
|
|
base.Minimum = value;
|
|
}
|
|
|
|
if (this.DesignMode) return;
|
|
|
|
if (this.Parent != null)
|
|
{
|
|
this.Parent.Controls.Add(lbl);
|
|
this.Parent.Controls.Add(lbl1);
|
|
}
|
|
}
|
|
}
|
|
|
|
public new int Maximum { get { return _max; } set { _max = value; base.Maximum = value; } }
|
|
|
|
[System.ComponentModel.Browsable(true),
|
|
System.ComponentModel.Category("Mine"),
|
|
System.ComponentModel.Description("Text under Bar")]
|
|
public string Label
|
|
{
|
|
get
|
|
{
|
|
return m_Text;
|
|
}
|
|
set
|
|
{
|
|
if (m_Text != value)
|
|
{
|
|
m_Text = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void drawlbl()
|
|
{
|
|
lbl.Location = new Point(this.Location.X, this.Location.Y + this.Height + 2);
|
|
lbl.ClientSize = new Size(this.Width, 13);
|
|
lbl.TextAlign = ContentAlignment.MiddleCenter;
|
|
lbl.Text = m_Text;
|
|
|
|
lbl1.Location = new Point(this.Location.X, this.Location.Y + this.Height + 15);
|
|
lbl1.ClientSize = new Size(this.Width, 13);
|
|
lbl1.TextAlign = ContentAlignment.MiddleCenter;
|
|
lbl1.Text = Value.ToString();
|
|
|
|
if (minline != 0 && maxline != 0)
|
|
{
|
|
float range = this.Maximum - this.Minimum;
|
|
float range2 = this.Width;
|
|
Graphics e = this.CreateGraphics();
|
|
Pen redPen = new Pen(Color.Red, 2);
|
|
|
|
if ((Type)this.GetType() == typeof(VerticalProgressBar)) {
|
|
range2 = this.Height;
|
|
e.DrawLine(redPen, 0, (this.Maximum - minline) / range * range2 + 0, this.Width, (this.Maximum - minline) / range * range2 + 0);
|
|
e.DrawLine(redPen, 0, (this.Maximum - maxline) / range * range2 + 0, this.Width, (this.Maximum - maxline) / range * range2 + 0);
|
|
e.DrawString(minline.ToString(), SystemFonts.DefaultFont, Brushes.Black, 5, (this.Maximum - minline) / range * range2 + 2);
|
|
e.DrawString(maxline.ToString(), SystemFonts.DefaultFont, Brushes.Black, 5, (this.Maximum - maxline) / range * range2 - 15);
|
|
} else {
|
|
e.DrawLine(redPen, (minline - this.Minimum) / range * range2 - 3, 0, (minline - this.Minimum) / range * range2 - 3, this.Height);
|
|
e.DrawLine(redPen, (maxline - this.Minimum) / range * range2 - 3, 0, (maxline - this.Minimum) / range * range2 - 3, this.Height);
|
|
e.DrawString(minline.ToString(), SystemFonts.DefaultFont, Brushes.Black, (minline - this.Minimum) / range * range2 - 35, 5);
|
|
e.DrawString(maxline.ToString(), SystemFonts.DefaultFont, Brushes.Black, (maxline - this.Minimum) / range * range2 - 3, 5);
|
|
}
|
|
}
|
|
}
|
|
|
|
public int minline { get; set; }
|
|
public int maxline { get; set; }
|
|
|
|
protected override void OnPaint(PaintEventArgs e)
|
|
{
|
|
base.OnPaint(e);
|
|
drawlbl();
|
|
}
|
|
}
|
|
}
|