bluesky8059

Untitled

Aug 17th, 2016
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 18.59 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. using System.IO.Ports;
  12. using System.Threading;
  13. using System.IO;
  14. using System.Diagnostics;
  15. using System.Collections.Concurrent;
  16.  
  17.  
  18. namespace TestUartForm
  19. {
  20.     public partial class Form1 : Form
  21.     {
  22.          enum State
  23.         {
  24.             CALIBRATION_ACC = 0,
  25.             CALIBRATION_MAG,
  26.             READ_DATA
  27.         };
  28.  
  29.         // This delegate enables asynchronous calls for setting
  30.         // the text property on a TextBox control.
  31.         delegate void SetTextCallback(string text);
  32.  
  33.         //Background Worker
  34.         private BackgroundWorker ReceiveProcess = new BackgroundWorker();
  35.         Semaphore ReceiveEndSync;
  36.         public bool ReceiveInfinite = false;
  37.         private int state = (int)State.CALIBRATION_ACC;
  38.  
  39.         //private const byte [] header = new const byte[2]{0x55, 0xAA};
  40.         private Boolean receiving;
  41.         private SerialPort comport = new SerialPort();
  42.         private Int32 totalLength = 0;
  43.         private Thread t, t1, d;
  44.         private int cnt = 1;
  45.        
  46.         private const Byte head = 0x55;
  47.  
  48.         private DateTime time_start, time_end;
  49.         delegate void Display(Byte[] buffer);
  50.  
  51.         private int indexofmatch = 0;
  52.         private int Size = 100000;
  53.         private int ContentLength = 0;
  54.         private Byte[] circular;
  55.         private int index = 0;
  56.         private int index_get = 0;
  57.         private Byte[] tempArray;
  58.  
  59.         private int now, past_time, delt = 0;
  60.  
  61.         private IMU sensor = new IMU();
  62.  
  63.         //Store raw binary data
  64.         private byte[] AccRaw = new byte[6];
  65.         private byte[] GyroRaw = new byte[6];
  66.         private byte[] MagRaw = new byte[6];
  67.         private byte[] TimeRaw = new byte[5];
  68.        
  69.         private float[] acc = new float[3];
  70.         private float[] gyro = new float[3];
  71.         private float[] mag = new float[3];
  72.         private float[] AccOffset = new float[3];
  73.         private float[] GyroOffset = new float[3];
  74.         private float[] MagOffset = new float[3];
  75.  
  76.         private float[] euler = new float[3];
  77.         private float[] q = new float[4];
  78.         private double AEq_1 = 1, AEq_2 = 0, AEq_3 = 0, AEq_4 = 0;
  79.         private int time = 0;
  80.  
  81.         private static Mutex mut = new Mutex();
  82.         private object locker = new Object(); // 用於獨佔鎖定的物件
  83.         private byte[] test = new byte[26] { 0x55, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
  84.                                              0x01, 0x28, 0x02, 0x78, 0x1F, 0x18,
  85.                                              0xFF, 0xDF, 0x00, 0x10, 0x00, 0x02,
  86.                                              0xFB, 0x00, 0x1F, 0x01, 0x63, 0x00};
  87.  
  88.         private byte[] checkCommand = new byte[11] { 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA };
  89.  
  90.         private ConcurrentQueue<byte> myQueue = new ConcurrentQueue<byte>();
  91.  
  92.         private int processed = 0;
  93.        
  94.         public Form1()
  95.         {
  96.             InitializeComponent();
  97.  
  98.             ReceiveEndSync = new Semaphore(0, 1);
  99.             //Backgroundworker
  100.             ReceiveProcess.WorkerReportsProgress = true;
  101.             ReceiveProcess.WorkerSupportsCancellation = true;
  102.             ReceiveProcess.DoWork += new DoWorkEventHandler(Parse);
  103.             ReceiveProcess.ProgressChanged += new ProgressChangedEventHandler(bw_ReceiveProcessProgressChanged);
  104.             ReceiveProcess.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_ReceiveProcessRunWorkerCompleted);
  105.            
  106.         }
  107.  
  108.         private void Form1_Load(object sender, EventArgs e)
  109.         {
  110.             comport.PortName = "COM42";
  111.             comport.BaudRate = 921600;
  112.             comport.DataBits = 8;
  113.             comport.StopBits = StopBits.One;
  114.  
  115.             comport.ReadBufferSize = 4096 * 100;
  116.  
  117.             comport.Close();
  118.  
  119.             try
  120.             {
  121.                 comport.Open();
  122.             }
  123.             catch (Exception exp)
  124.             {
  125.                 Debug.Print(exp.ToString());
  126.             }
  127.             while (!comport.IsOpen) { }
  128.             comport.DiscardInBuffer();
  129.             byte[] wdata = { 0x55, 0x01, 0x01, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xAA };
  130.  
  131.             comport.Write(wdata, 0, 11);
  132.             int reslen = 0;
  133.             while (reslen < 7)
  134.             {
  135.                 reslen = comport.BytesToRead;
  136.             }
  137.             byte[] resbuf = new byte[7];
  138.             comport.Read(resbuf, 0, reslen);
  139.  
  140.             receiving = true;
  141.             t = new Thread(DoReceive);
  142.             t.IsBackground = true;
  143.  
  144.             ReceiveProcess.RunWorkerAsync();
  145.             t.Start();
  146.         }
  147.  
  148.         private void DoReceive()
  149.         {
  150.             time_start = DateTime.Now;
  151.             while (receiving)
  152.             {
  153.                 int length = comport.BytesToRead;
  154.                 byte[] buf = new byte[length];
  155.                 byte[] test = new byte[length];
  156.                  
  157.                 if (length > 0)
  158.                 {
  159.                     //ContentLength += length;
  160.  
  161.                     Array.Resize(ref buf, length);
  162.                     comport.Read(buf, 0, length);
  163.                     //fs_test.Write(buf, 0, length);
  164.                     //lock (myQueue)
  165.                     //{
  166.                         for (int j = 0; j < length; j++ )
  167.                            myQueue.Enqueue(buf[j]);
  168.                     //}
  169.                         Thread.Sleep(1);
  170.                 }
  171.             }
  172.         }
  173.  
  174.         private void bw_ReceiveProcessRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  175.         {
  176.  
  177.         }
  178.  
  179.         private void bw_ReceiveProcessProgressChanged(object sender, ProgressChangedEventArgs e)
  180.         {
  181.  
  182.             //DateTime dt = DateTime.Now;
  183.             double ESq_1, ESq_2, ESq_3, ESq_4;                              // quaternion describing orientation of sensor relative to earth
  184.             double ASq_1, ASq_2, ASq_3, ASq_4;                              // quaternion describing orientation of sensor relative to auxiliary frame
  185.             double r_11, r_12, r_13, r_21, r_22, r_23, r_31, r_32, r_33;    // rotation matrix elements
  186.             double phi, theta, psi;                                         // Euler angles
  187.             Graphics graphics = this.CreateGraphics();                      // graphics object for visualisation
  188.             Pen penB; ;                                                     // blue pen for x-axis
  189.             Pen penR;                                                       // blue pen for x-axis
  190.             Pen penG;                                                       // blue pen for x-axis
  191.             Font font = new Font("Arial", 12);                              // font object for graphics text
  192.             int origin_x = 620;                                             // x origin of axis in form
  193.             int origin_y = 300;                                             // y origin of axis in form
  194.             int axisLength = (int)(0.6 * origin_y);                         // length of axis displayed in graphics
  195.             int axisWidth = (int)(0.075 * axisLength);                      // width of the axis displayed in graphics
  196.  
  197.             // compute the quaternion conjugate
  198.             ESq_1 = q[0];
  199.             ESq_2 = -q[1];
  200.             ESq_3 = -q[2];
  201.             ESq_4 = -q[3];
  202.  
  203.             // compute the quaternion product
  204.             ASq_1 = ESq_1 * AEq_1 - ESq_2 * AEq_2 - ESq_3 * AEq_3 - ESq_4 * AEq_4;
  205.             ASq_2 = ESq_1 * AEq_2 + ESq_2 * AEq_1 + ESq_3 * AEq_4 - ESq_4 * AEq_3;
  206.             ASq_3 = ESq_1 * AEq_3 - ESq_2 * AEq_4 + ESq_3 * AEq_1 + ESq_4 * AEq_2;
  207.             ASq_4 = ESq_1 * AEq_4 + ESq_2 * AEq_3 - ESq_3 * AEq_2 + ESq_4 * AEq_1;
  208.  
  209.             // compute the Euler anles from the quaternion
  210.             //phi = Math.Atan2(2 * ASq_3 * ASq_4 - 2 * ASq_1 * ASq_2, 2 * ASq_1 * ASq_1 + 2 * ASq_4 * ASq_4 - 1);
  211.             //theta = -Math.Asin(2 * ASq_2 * ASq_3 - 2 * ASq_1 * ASq_3);
  212.             //psi = Math.Atan2(2 * ASq_2 * ASq_3 - 2 * ASq_1 * ASq_4, 2 * ASq_1 * ASq_1 + 2 * ASq_2 * ASq_2 - 1);
  213.  
  214.             //sw.WriteLine(phi + "," + theta + "," + psi);
  215.  
  216.             // compute rotation matrix from quaternion
  217.             r_11 = 2 * ASq_1 * ASq_1 - 1 + 2 * ASq_2 * ASq_2;
  218.             r_12 = 2 * (ASq_2 * ASq_3 + ASq_1 * ASq_4);
  219.             r_13 = 2 * (ASq_2 * ASq_4 - ASq_1 * ASq_3);
  220.             r_21 = 2 * (ASq_2 * ASq_3 - ASq_1 * ASq_4);
  221.             r_22 = 2 * ASq_1 * ASq_1 - 1 + 2 * ASq_3 * ASq_3;
  222.             r_23 = 2 * (ASq_3 * ASq_4 + ASq_1 * ASq_2);
  223.             r_31 = 2 * (ASq_2 * ASq_4 + ASq_1 * ASq_3);
  224.             r_32 = 2 * (ASq_3 * ASq_4 - ASq_1 * ASq_2);
  225.             r_33 = 2 * ASq_1 * ASq_1 - 1 + 2 * ASq_4 * ASq_4;
  226.  
  227.             // draw sensor frame axes to graphics object in correct order
  228.             penB = new Pen(Color.Blue, axisWidth);
  229.             penR = new Pen(Color.Red, axisWidth);
  230.             penG = new Pen(Color.Green, axisWidth);
  231.             graphics.Clear(SystemColors.Control);
  232.             if ((r_21 > r_22) && (r_21 > r_23))
  233.                 graphics.DrawLine(penB, origin_x, origin_y, (int)(origin_x + (axisLength * r_11)), (int)(origin_y + (axisLength * -r_31)));
  234.             else if ((r_22 > r_21) && (r_22 > r_23))
  235.                 graphics.DrawLine(penR, origin_x, origin_y, (int)(origin_x + (axisLength * r_12)), (int)(origin_y + (axisLength * -r_32)));
  236.             else if ((r_23 > r_21) && (r_23 > r_22))
  237.                 graphics.DrawLine(penG, origin_x, origin_y, (int)(origin_x + (axisLength * r_13)), (int)(origin_y + (axisLength * -r_33)));
  238.  
  239.             if (((r_21 > r_22) && (r_21 < r_23)) || ((r_21 < r_22) && (r_21 > r_23)))
  240.                 graphics.DrawLine(penB, origin_x, origin_y, (int)(origin_x + (axisLength * r_11)), (int)(origin_y + (axisLength * -r_31)));
  241.             else if (((r_22 > r_21) && (r_22 < r_23)) || ((r_22 < r_21) && (r_22 > r_23)))
  242.                 graphics.DrawLine(penR, origin_x, origin_y, (int)(origin_x + (axisLength * r_12)), (int)(origin_y + (axisLength * -r_32)));
  243.             else if (((r_23 > r_21) && (r_23 < r_22)) || ((r_23 < r_21) && (r_23 > r_22)))
  244.                 graphics.DrawLine(penG, origin_x, origin_y, (int)(origin_x + (axisLength * r_13)), (int)(origin_y + (axisLength * -r_33)));
  245.  
  246.             if ((r_21 < r_22) && (r_21 < r_23))
  247.                 graphics.DrawLine(penB, origin_x, origin_y, (int)(origin_x + (axisLength * r_11)), (int)(origin_y + (axisLength * -r_31)));
  248.             else if ((r_22 < r_21) && (r_22 < r_23))
  249.                 graphics.DrawLine(penR, origin_x, origin_y, (int)(origin_x + (axisLength * r_12)), (int)(origin_y + (axisLength * -r_32)));
  250.             else if ((r_23 < r_21) && (r_23 < r_22))
  251.                 graphics.DrawLine(penG, origin_x, origin_y, (int)(origin_x + (axisLength * r_13)), (int)(origin_y + (axisLength * -r_33)));
  252.  
  253.             graphics.DrawString("x", font, Brushes.Black, (int)(origin_x + (axisLength * r_11)), (int)(origin_y + (axisLength * -r_31)));
  254.             graphics.DrawString("y", font, Brushes.Black, (int)(origin_x + (axisLength * r_12)), (int)(origin_y + (axisLength * -r_32)));
  255.             graphics.DrawString("z", font, Brushes.Black, (int)(origin_x + (axisLength * r_13)), (int)(origin_y + (axisLength * -r_33)));
  256.  
  257.             proc.Text = e.ProgressPercentage.ToString();
  258.             AX.Text = acc[0].ToString();
  259.             AY.Text = acc[1].ToString();
  260.             AZ.Text = acc[2].ToString();
  261.             GX.Text = gyro[0].ToString();
  262.             GY.Text = gyro[1].ToString();
  263.             GZ.Text = gyro[2].ToString();
  264.             MX.Text = mag[0].ToString();
  265.             MY.Text = mag[1].ToString();
  266.             MZ.Text = mag[2].ToString();
  267.             roll.Text = euler[0].ToString();
  268.             pitch.Text = euler[1].ToString();
  269.             yaw.Text = euler[2].ToString();
  270.             AccXOffset.Text = AccOffset[0].ToString();
  271.             AccYOffset.Text = AccOffset[1].ToString();
  272.             AccZOffset.Text = AccOffset[2].ToString();
  273.  
  274.             GyroXOffset.Text = GyroOffset[0].ToString();
  275.             GyroYOffset.Text = GyroOffset[1].ToString();
  276.             GyroZOffset.Text = GyroOffset[2].ToString();
  277.  
  278.             MagXOffset.Text = MagOffset[0].ToString();
  279.             MagYOffset.Text = MagOffset[1].ToString();
  280.             MagZOffset.Text = MagOffset[2].ToString();
  281.             graphics.Dispose();
  282.             Thread.Sleep(1);
  283.         }
  284.  
  285.         private void Parse(object sender, DoWorkEventArgs e)
  286.         {
  287.             BackgroundWorker ReceiveWorker = sender as BackgroundWorker;
  288.  
  289.             while (receiving)
  290.             {
  291.                 //try
  292.                 //{
  293.                 if (ReceiveWorker.CancellationPending == true)
  294.                 {
  295.                     e.Cancel = true;
  296.                     ReceiveEndSync.Release();
  297.                     break;
  298.                 }
  299.                 else
  300.                 {
  301.                     int startindex = 0;
  302.  
  303.                     tempArray = new Byte[26];
  304.                     byte get;
  305.                     //lock (myQueue)
  306.                     //{
  307.                         if (myQueue.Count > 26)
  308.                         {
  309.                             if ((byte)myQueue.ToArray()[index_get] == 0x55)
  310.                             {
  311.                                 index_get++;
  312.                                 if ((byte)myQueue.ToArray()[index_get] == 0xAA)
  313.                                 {
  314.                                     index_get--;
  315.                                     startindex = (index_get + Size) % Size;
  316.                                     if (index_get > 0)
  317.                                     {
  318.                                         int i = 0;
  319.                                         while ((i < index_get) && (myQueue.TryDequeue(out get)))
  320.                                         {
  321.                                             i++;
  322.                                         }
  323.                                     }
  324.                                     for (int j = 0; j < 26; j++)
  325.                                     {
  326.                                          myQueue.TryDequeue(out tempArray[j]);
  327.                                     }
  328.                                     for (int k = 0; k < 6; k++)
  329.                                     {
  330.                                         AccRaw[k] = tempArray[k + 8];
  331.                                         GyroRaw[k] = tempArray[k + 14];
  332.                                         MagRaw[k] = tempArray[k + 20];
  333.                                     }
  334.  
  335.                                     for (int index = 0; index < 5; index++)
  336.                                         TimeRaw[index] = tempArray[index + 2];
  337.  
  338.                                     if (state == (int)State.CALIBRATION_ACC)
  339.                                     {
  340.                                         sensor.SetData(AccRaw, GyroRaw, MagRaw, TimeRaw);
  341.                                         sensor.UpdateAGOffset();
  342.                                         processed++;
  343.                                         if (processed == 1000)
  344.                                         {
  345.                                             AccOffset = sensor.GetAccOffset();
  346.                                             GyroOffset = sensor.GetGyroOffset();
  347.                                             processed = 0;
  348.                                             state = (int)State.CALIBRATION_MAG;
  349.                                         }
  350.                                     }
  351.                                     else if (state == (int)State.CALIBRATION_MAG)
  352.                                     {
  353.                                         sensor.SetData(AccRaw, GyroRaw, MagRaw, TimeRaw);
  354.                                         sensor.UpdateMOffset();
  355.                                         processed++;
  356.                                         if (processed == 1000)
  357.                                         {
  358.                                             MagOffset = sensor.GetMagOffset();
  359.                                             processed = 0;
  360.                                             state = (int)State.READ_DATA;
  361.                                         }
  362.  
  363.                                     }
  364.                                     else if (state == (int)State.READ_DATA)
  365.                                     {
  366.                                         sensor.SetData(AccRaw, GyroRaw, MagRaw, TimeRaw);
  367.                                         sensor.update();
  368.                                         acc = sensor.GetAcc();
  369.                                         gyro = sensor.GetGyro();
  370.                                         mag = sensor.GetMag();
  371.                                         euler = sensor.GetEuler();
  372.                                         q = sensor.GetQuaternion();
  373.  
  374.                                         sensor.Save();
  375.                                         processed++;
  376.                                         //Thread.Sleep(10);
  377.                                        
  378.                                     }
  379.                                     if (processed % 10 == 0)
  380.                                     {
  381.                                         ReceiveWorker.ReportProgress(processed);
  382.                                     }
  383.                                     index_get = 0;
  384.                                    
  385.                                     Thread.Sleep(1);
  386.                                 }
  387.                                 else
  388.                                 {
  389.                                     index_get++;
  390.                                 }
  391.                             }
  392.                             else
  393.                             {
  394.                                 index_get++;
  395.                             }
  396.                         }
  397.                     //}
  398.                 }
  399.              }
  400.         }
  401.  
  402.         private void Button_ClearTextbox_Click(object sender, EventArgs e)
  403.         {
  404.             TextBox1.Clear();
  405.         }
  406.  
  407.         private void Button_AbortThread_Click(object sender, EventArgs e)
  408.         {
  409.             Close();
  410.         }
  411.  
  412.         private void Close()
  413.         {
  414.             receiving = false;
  415.  
  416.             time_end = DateTime.Now;
  417.             comport.Close();
  418.             sensor.WriteToFile((time_end - time_start).TotalMilliseconds.ToString());
  419.             sensor.Close();
  420.             t.Abort();
  421.             ReceiveProcess.CancelAsync();
  422.             //this.Dispose();
  423.         }
  424.  
  425.     }
  426. }
Add Comment
Please, Sign In to add comment