GeekIMU/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/IMUInformation.cs

434 lines
15 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using SharpGL;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.Diagnostics;
using System.Threading;
using CCWin;
namespace DM_CalibrationTools
{
// struct mVector3
// {
// public float x, y, z;
// };
public partial class IMUInformation : Form
{
Boolean global_IsCali=false;
HashSet<double[]> magcalidata = new HashSet<double[]>();
private Point mPoint;
bool isGetCalibrateData = false;
public IMUInformation()
{
InitializeComponent();
}
csgl gl;
private void Form1_Load(object sender, EventArgs e)
{
Console.WriteLine("C#:InitCaliAPI");
Debug.WriteLine(CaliAPI.InitCaliAPI("VID_2833&PID_0002"));
this.Text = "GeekIMU管理软件";
gl = new csgl(openGLControl1);
this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.GLpanel_MouseWheel);
// 默认状态为隐藏
//Gbox_OpenGL.Hide();
//Panel_Sensor_Information.Hide();
//Panel_Bottom.Hide();
DrawIMUInformationGrid(0, 0);
}
private void GLpanel_MouseWheel(object sender, MouseEventArgs e)
{
if (gl.Global_MouseInGLPanel)
gl.zoomCameraDelta(e.Delta / 60);
}
private void GLpanel_MouseEnter(object sender, EventArgs e)
{
gl.Global_MouseInGLPanel = true;
}
private void GLpanel_MouseLeave(object sender, EventArgs e)
{
gl.Global_MouseInGLPanel = false;
}
private void sceneControl1_OpenGLDraw(object sender, PaintEventArgs e)
{
gl.Draw();
}
private void sceneControl1_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Middle)
{
gl.resetView();
}
}
private void sceneControl1_MouseDown(object sender, MouseEventArgs e)
{
gl.Global_MouseDown = true;
gl.setMousePos(e.X, e.Y);
}
private void sceneControl1_MouseMove(object sender, MouseEventArgs e)
{if(gl!=null)
if (gl.Global_MouseDown)
{
if (e.Button == MouseButtons.Left && Control.ModifierKeys == Keys.Control)
{
gl.moveCameraXY(e.X, e.Y);
}
else if (e.Button == MouseButtons.Right && Control.ModifierKeys == Keys.Control)
{
gl.moveCameraZ(e.X, e.Y);
}
else if (e.Button == MouseButtons.Left)
{
gl.rotateCamera(e.X, e.Y);
}
else if (e.Button == MouseButtons.Right)
{
gl.zoomCamera(e.Y);
}
}
}
private void sceneControl1_MouseUp(object sender, MouseEventArgs e)
{
gl.Global_MouseDown = false;
gl.setMousePos(e.X, e.Y);
}
private void Form1_Resize(object sender, EventArgs e)
{
}
private void sceneControl1_Resized(object sender, EventArgs e)
{if(gl!=null)
gl.resize();
}
private void timer1_Tick(object sender, EventArgs e)
{
this.Invoke(new EventHandler(delegate
{
if(global_IsCali)
{
if (magcalidata.Count <= 4000)
{
mVector3 v3f = CaliAPI.GetPoint();
double[] v3d = { v3f.x, v3f.y, v3f.z };
if (v3d[0] != -99999.0 || v3d[1] != -99999.0 || v3d[2] != -99999.0)
magcalidata.Add(v3d);
gl.setPointarr(magcalidata);
}
else
{
global_IsCali = false;
timer1.Interval = 100;
Debug.WriteLine("auto stop:" + CaliAPI.FinishMagCali());
}
}
if (global_IsCali)
{
btnLoadorCali.Enabled = false;
}
else
{
btnLoadorCali.Enabled = true;
}
if (CaliAPI.CheckDevice() == 1)
{
btnCalliGyro.Enabled = true;
btnResetCalibrationData.Enabled = true;
btnMagCalibtation.Enabled = true;
mVector3 v = CaliAPI.GetEulerianAngle();
if (v.x != -99999.0 || v.y != -99999.0 || v.z != -99999.0)
{
v.z += v.z > 0 ? -90 : 90;
v.y += 180;
v.y = v.y > 180 ? v.y - 360 : v.y;
labelAngle.Text = "Pitch : " + v.z.ToString("+#.#;-#.#;0") + "° " +
" Roll : " + v.y.ToString("+#.#;-#.#;0") + "° " +
" Yaw : " + v.x.ToString("+#.#;-#.#;0") + "°";
}
if (isGetCalibrateData == false) {
MagCaliParam p = CaliAPI.GetMagCali();
mVector3 g = CaliAPI.GetGyroCali();
labelMagOffset.Text = p.xOffset + " " + p.xScale + "\n" + p.yOffset + " " + p.yScale + "\n" + p.yOffset + " " + p.zScale;
labelGyroOffset.Text = g.x + " " + g.y + " " + g.z;
isGetCalibrateData = true;
}
}
else
{
btnCalliGyro.Enabled = false;
btnResetCalibrationData.Enabled = false;
btnMagCalibtation.Enabled = false;
}
}));
}
private void button3_Click(object sender, EventArgs e)
{
gl.DrawFlag = 1;
if (btnMagCalibtation.Text.Equals("开始校准磁力计"))
{
this.Invoke(new EventHandler(delegate
{
magcalidata.Clear();
CaliAPI.MagCali();
global_IsCali = true;
timer1.Interval = 5;
}));
btnMagCalibtation.Text = "结束校准磁力计";
}
else
{
global_IsCali = false;
timer1.Interval = 50;
CaliAPI.FinishMagCali();
txtreader.saveData(magcalidata);
MagCaliParam p = CaliAPI.CalculateMagParam();
//Debug.WriteLine(p.xOffset + "," + p.yOffset + "," + p.zOffset + "," + p.xScale + "," + p.yScale + "," + p.zScale);
labelMagOffset.Text = p.xOffset + " " + p.xScale + "\n" + p.yOffset + " " + p.yScale + "\n" + p.yOffset + " " + p.zScale;
CaliAPI.SetMagCali(p.xOffset, p.yOffset, p.zOffset, p.xScale, p.yScale, p.zScale);
pointstage = 0;
button4_Click(sender, e);
btnMagCalibtation.Text = "开始校准磁力计";
}
}
private void button2_Click(object sender, EventArgs e)
{
if(MessageBox.Show("该操作不可逆,是否继续?","重置校准数据",MessageBoxButtons.OKCancel,MessageBoxIcon.Question,MessageBoxDefaultButton.Button2)==DialogResult.OK)
{
if (CaliAPI.SetMagCali(0, 0, 0, 1, 1, 1) == 1) {
isGetCalibrateData = false;
}
}
}
private void button1_Click(object sender, EventArgs e)
{
MagCaliParam p = CaliAPI.GetMagCali();
mVector3 g = CaliAPI.GetGyroCali();
labelMagOffset.Text = p.xOffset + " " + p.xScale + "\n" + p.yOffset + " " + p.yScale + "\n" + p.yOffset +" "+ p.zScale ;
labelGyroOffset.Text = g.x + " " + g.y + " "+g.z;
}
static int pointstage = 0;
txtreader global_tr = null;
HashSet<double[]> hs;
private void button4_Click(object sender, EventArgs e)
{
gl.DrawFlag = 1;
//mVector3 v3 = CaliAPI.GetPoint();
//Debug.WriteLine(v3.x+" "+v3.y+" "+v3.z+" ");
if ((global_tr == null) || (pointstage == 0))
{
btnLoadorCali.Text = "绘制校准数据";
global_tr = new txtreader("data");
global_tr.GetData();
pointstage=1;
hs = global_tr.getHashset();
}
else if(pointstage == 1 )
{
btnLoadorCali.Text = "加载原始数据";
HashSet<double[]> hs1 = new HashSet<double[]>();
if(hs.Count >100)
{
MagCaliParam mcp= CaliAPI.CalculateMagParam();
foreach (var d in hs)
{
double[] v = { (d[0] - mcp.xOffset) * mcp.xScale, (d[1] - mcp.yOffset) * mcp.yScale, (d[2] - mcp.zOffset) * mcp.zScale };
hs1.Add(v);
}
hs = hs1;
}
else
{
MessageBox.Show("数据太少,无法计算校准参数!");
}
pointstage = 0;
}
gl.setPointarr(hs);
}
private void DrawIMUInformationGrid(int cols, int rows)
{
Bitmap b = new Bitmap(Panel_Sensor_Information.Width, Panel_Sensor_Information.Height);
Graphics g = Graphics.FromImage(b);
Rectangle rect = new Rectangle(5,
0,
Panel_Sensor_Information.Width - 10, 360);
g.DrawRectangle(new Pen(Color.FromArgb(228, 228, 228), 1), rect);
g.FillRectangle(new SolidBrush(Color.FromArgb(249, 249, 249)),
new Rectangle(new Point(6, 1),
new Size(Panel_Sensor_Information.Width - 11, 40)));
int padding = 28;
int stLocation = 68;
for (int i = 0; i < 4; i++) {
g.FillRectangle(new SolidBrush(Color.FromArgb(249, 249, 249)),
new Rectangle(new Point(6, 1 + i * padding * 2 + stLocation),
new Size(Panel_Sensor_Information.Width - 11, padding)));
}
g.Dispose();
Panel_Sensor_Information.Show();
Panel_Sensor_Information.BackgroundImage = b;
}
// 获取传感器的状态
public bool GetIMUStatus()
{
if (CaliAPI.CheckDevice() == 1) {
return true;
}
return false;
}
private void button5_Click(object sender, EventArgs e)
{
global_IsCali = false;
timer1.Interval = 100;
Debug.WriteLine(CaliAPI.FinishMagCali());
txtreader.saveData(magcalidata);
MagCaliParam p = CaliAPI.CalculateMagParam();
Debug.WriteLine(p.xOffset + "," + p.yOffset + "," + p.zOffset + "," + p.xScale + "," + p.yScale + "," + p.zScale);
Debug.WriteLine(CaliAPI.SetMagCali(p.xOffset, p.yOffset, p.zOffset, p.xScale, p.yScale, p.zScale));
pointstage = 0;
button4_Click(sender, e);
}
private void button6_Click(object sender, EventArgs e)
{
DialogResult dr = MessageBox.Show("校准过程约2秒请保持设备静置单击确定开始。", "陀螺仪校准", MessageBoxButtons.OKCancel, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
if (dr != DialogResult.OK && CaliAPI.CheckDevice() == 1)
{
return;
}
else
{
int result = CaliAPI.GyroCali();
Thread.Sleep(1000);
if (result == 1)
{
MessageBox.Show("校准成功!");
mVector3 g = CaliAPI.GetGyroCali();
labelGyroOffset.Text = g.x + " " + g.y + " " + g.z + "\n";
}
else
MessageBox.Show("校准失败!");
}
}
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
System.Diagnostics.Process.Start("https://shop408976235.taobao.com/");
}
private void pictureBox1_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("https://shop408976235.taobao.com/");
}
private void BtnShowAngle_Click(object sender, EventArgs e)
{
gl.DrawFlag = 2;
CaliAPI.Correction();
}
private void BtnHelp_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start(Application.StartupPath+"/DM上位机校准软件说明.pdf");
}
private void sceneControl1_OpenGLDraw(object sender)
{
}
private void sceneControl1_OpenGLInitialized(object sender, EventArgs e)
{
OpenGL gl = openGLControl1.OpenGL;
gl.ClearColor(0, 0, 0, 0);
}
private void Btn_Close_Click(object sender, EventArgs e)
{
this.Close();
}
private void Control_Panel_MouseDown(object sender, MouseEventArgs e)
{
mPoint = new Point(e.X, e.Y);
}
private void Control_Panel_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y);
}
}
private void Btn_min_Click(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Minimized;
}
private void Btn_support_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start(Application.StartupPath + "/DM上位机校准软件说明.pdf");
}
private void panel2_Paint(object sender, PaintEventArgs e)
{
}
private void labelAngle_Click(object sender, EventArgs e)
{
}
}
}