bluesky8059

Untitled

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