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

434 lines
15 KiB
C#
Raw Normal View History

2024-11-09 21:39:20 +08:00
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");
CaliAPI.Init("VID_2833&PID_0002");
2024-11-09 21:39:20 +08:00
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)
{
}
}
}