Newer
Older
RbFreqStand / RbFreqStandMeasure / tools / FreshStatus.cs
yxw on 1 Jun 2021 22 KB 20210601合并测试
using Casic.Birmm.RbFreqStandMeasure.Properties;
using Casic.Birmm.RbFreqStandMeasure.R_DataBase.Model;
using Casic.Birmm.RbFreqStandMeasure.R_DataBase.Service;
using Casic.Birmm.RbFreqStandMeasure.R_DataBase.Service.Impl;
using Casic.Birmm.RbFreqStandMeasure.Tools;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO.Ports;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace Casic.Birmm.RbFreqStandMeasure.tools
{
    public class FreshStatus
    {
        private static System.Threading.Timer timerClock;
        private static System.Threading.Timer timerSatellite;
        public static bool isStarted = false;
        public static SerialPort portClock = new SerialPort();
        public static SerialPort portSatellite = new SerialPort();
        private static readonly object obj = new object();
        public static string clockStatus = "";
        public static string receiverStatus = "";
        public static string date = "";
        public static string time = "";
        public static string mjd = "";
        public static string lat = "";
        public static string lng = "";
        public static string x = "";
        public static string y = "";
        public static string z = "";
        public static List<string> gpList = new List<string>();
        public static List<string> bdList = new List<string>();
        public static int totalGP = 0;
        public static int totalBD = 0;
        

        // 获取铷钟数据
        public static void startClockFresh()
        {            
            timerClock = new System.Threading.Timer(exeClock, null, 50, 60 * 1000);
            isStarted = true;
        }
        
        private static void exeClock(Object State)
        {
            try
            {
                if (!portClock.IsOpen)
                {
                    string portName = ConfigHelper.GetAppConfig("clock").Split(' ')[0];
                    int bandRate = Convert.ToInt32(ConfigHelper.GetAppConfig("clock").Split(' ')[1]);
                    portClock.PortName = portName;
                    portClock.BaudRate = bandRate;
                    portClock.Parity = Parity.None;
                    portClock.DataBits = 8;
                    portClock.StopBits = StopBits.One;
                    portClock.Handshake = Handshake.None;
                    portClock.ReadTimeout = -1;
                    portClock.WriteTimeout = 3000;

                    // 打开串口
                    if (!portClock.IsOpen) portClock.Open();
                    if (portClock.IsOpen)
                    {
                        portClock.Write("<OPNRS232>");
                        LogHelper.WriteInfoLog(MethodBase.GetCurrentMethod().DeclaringType, "打开串口成功!" + portName);
                    }
                    else
                    {
                        MessageBox.Show("无法打开串口" + portName + ",原子钟状态获取失败!");
                        return;
                    }
                }
                int count = 0;
                while (count < 500)
                {
                    int Readlen = portClock.BytesToRead;
                    // 接收到数据
                    if (Readlen > 0)
                    {
                        byte[] buffer = new byte[Readlen];
                        portClock.Read(buffer, 0, Readlen);// 接收数据到buffer里面                    
                        string data = Encoding.ASCII.GetString(buffer);

                        if (data.StartsWith("$") && data.Contains("*"))
                        {
                            lock (obj)
                            {
                                if (data.Split(',').Length > 9)
                                {
                                    string clockStatusCode = data.Split(',')[9];
                                    switch (clockStatusCode)
                                    {
                                        case "1": clockStatus = "预热"; break;
                                        case "2": clockStatus = "自由运动"; break;
                                        case "3": clockStatus = "捕获"; break;
                                        case "4": clockStatus = "快锁"; break;
                                        case "5": clockStatus = "慢锁"; break;
                                        case "7": clockStatus = "保持"; break;
                                        default: break;
                                    }
                                    break;
                                }
                            }
                        }
                    }
                    count++;
                }

                //new Thread(() =>
                //{
                    lock (obj)
                    {
                        //if (StatusCtrlForm.receiverStatus == "警告") clockStatus = "未锁定";
                        //else clockStatus = "锁定";
                        StatusCtrlForm.statusCtrlForm.label_clockStatus.Text = clockStatus;
                        HomeCtrlForm.homeCtrlForm.label_clockStatus.Text = clockStatus;
                    }

                //}).Start();
            }
            catch (Exception e)
            {
                LogHelper.WriteInfoLog(MethodBase.GetCurrentMethod().DeclaringType, "原子钟数据错误:" + e.Message);
            }
        }

        // 获取卫星RMC数据
        public static void startSatelliteFresh()
        {           
            //timerSatellite = new System.Threading.Timer(exeSatellite, null, 50, 60 * 1000);
            //isStarted = true;
        }
        public static void exeSatellite()
        {
            try
            {
                if (!portSatellite.IsOpen)
                {
                    string portName = ConfigHelper.GetAppConfig("satellite").Split(' ')[0];
                    int bandRate = Convert.ToInt32(ConfigHelper.GetAppConfig("satellite").Split(' ')[1]);
                    portSatellite.PortName = portName;
                    portSatellite.BaudRate = bandRate;
                    portSatellite.Parity = Parity.None;
                    portSatellite.DataBits = 8;
                    portSatellite.StopBits = StopBits.One;
                    portSatellite.Handshake = Handshake.None;
                    portSatellite.ReadTimeout = -1;
                    portSatellite.WriteTimeout = 3000;

                    // 打开串口
                    if (!portSatellite.IsOpen) portSatellite.Open();
                    if (portSatellite.IsOpen)
                    {
                        LogHelper.WriteInfoLog(MethodBase.GetCurrentMethod().DeclaringType, "打开卫星状态串口成功!" + portName);
                    }
                    else
                    {
                        MessageBox.Show("无法打开串口" + portName + ",卫星状态更新失败!");
                        return;
                    }
                }

                int bdMessCount = 0;
                int gpMessCount = 0;
                int count = 0;
                while (count < 100)
                {
                    Thread.Sleep(100);                    
                    int Readlen = portSatellite.BytesToRead;
                   
                    if (Readlen > 0)
                    {
                        byte[] buffer = new byte[Readlen];
                        portSatellite.Read(buffer, 0, Readlen);// 接收数据到buffer里面
                        string data = Encoding.ASCII.GetString(buffer);
                        
                        string[] dataArray = data.Split('$');
                        if (dataArray.Length > 0)
                        {
                            lock (obj)
                            {
                                gpList.Clear();
                                bdList.Clear();
                                totalGP = 0;
                                totalBD = 0;
                            }
                             int index = -1;
                            bool drawed = false;
                            bool gga = false;
                            bool rmc = false;
                            foreach (string sss in dataArray)
                            {
                                index++;
                                LogHelper.WriteInfoLog(MethodBase.GetCurrentMethod().DeclaringType, "index : " + index);

                                if ((sss.Contains("GPGGA")||sss.Contains("GNGGA")) && sss.Contains("*"))
                                {                                    
                                    string[] resultArray = sss.Split(',');
                                    if (resultArray.Length > 5)
                                    {
                                        gga = true;
                                        try
                                        {
                                            lat = resultArray[2].Replace(".", "").Insert(2, ".") + resultArray[3];
                                            lng = resultArray[4].Replace(".", "").Insert(3, ".") + resultArray[5];
                                            x = parseGGA(sss).Split(',')[0];
                                            y = parseGGA(sss).Split(',')[1];
                                            z = parseGGA(sss).Split(',')[2];

                                            //new Thread(() =>
                                            //{
                                                lock (obj)
                                                {
                                                    StatusCtrlForm.statusCtrlForm.label_lat.Text = lat;
                                                    StatusCtrlForm.statusCtrlForm.label_lng.Text = lng;
                                                    StatusCtrlForm.statusCtrlForm.label_x.Text = x;
                                                    StatusCtrlForm.statusCtrlForm.label_y.Text = y;
                                                    StatusCtrlForm.statusCtrlForm.label_z.Text = z;                                                }

                                            //}).Start();
                                        }
                                        catch (Exception ex)
                                        {
                                            LogHelper.WriteInfoLog(MethodBase.GetCurrentMethod().DeclaringType, "GGA error:" + ex.Message);
                                        }
                                    }
                                }
                                else if (sss.Contains("GNRMC") && sss.Contains("*"))
                                {                                    
                                    string[] resultArray = sss.Split(',');
                                    if (resultArray.Length > 9)
                                    {
                                        rmc = true;
                                        date = resultArray[9];
                                        mjd = "";
                                        if (date.Length > 5)
                                        {
                                            mjd = getMJD("20" + date.Substring(4, 2), date.Substring(2, 2), date.Substring(0, 2));
                                            date = "20"+date.Substring(4, 2) + "-" + date.Substring(2, 2) + "-" + date.Substring(0, 2);

                                        }
                                        time = resultArray[1];                                       
                                        if (time.Length > 5)
                                        {
                                            int hour = Convert.ToInt32(time.Substring(0, 2));
                                            if ((hour + 8) > 23) hour = hour + 8 - 24;
                                            else hour = hour + 8;

                                            time = hour + ":" + time.Substring(2, 2) + ":" + time.Substring(4);
                                           
                                        }

                                        if(resultArray[2] == "A" ) receiverStatus = "定位有效" ;
                                        else if(resultArray[2] == "V") receiverStatus = "警告";

                                        //new Thread(() =>
                                        //{
                                            try
                                            {

                                                lock (obj)
                                                {
                                                    StatusCtrlForm.statusCtrlForm.label_date.Text = date;
                                                    StatusCtrlForm.statusCtrlForm.label_time.Text = time;
                                                    StatusCtrlForm.statusCtrlForm.label_mjd.Text = mjd;
                                                    StatusCtrlForm.statusCtrlForm.label_receiverStatus.Text = receiverStatus;
                                                    HomeCtrlForm.homeCtrlForm.label_receiverStatus.Text = receiverStatus;
                                                }

                                            }
                                            catch (Exception ex)
                                            {
                                                LogHelper.WriteInfoLog(MethodBase.GetCurrentMethod().DeclaringType, "RMC error:" + ex.Message);
                                            }

                                        //}).Start();

                                    }
                                    
                                }
                                else if ((sss.Contains("GPGSV") || sss.Contains("BDGSV") || sss.Contains("GBGSV")) && sss.Contains("*"))
                                {
                                     if (sss.Split(',').Length > 8)
                                    {      
                                        if (sss.Contains("GPGSV"))
                                        {
                                            gpMessCount = Convert.ToInt32(sss.Split(',')[1]);
                                            if (gpList.Count < gpMessCount)
                                            {
                                                gpList.Add(sss);
                                                totalGP = Convert.ToInt32(sss.Split(',')[3]);
                                            }                                           
                                        }
                                        else
                                        {
                                            bdMessCount = Convert.ToInt32(sss.Split(',')[1]);
                                            if (bdList.Count < bdMessCount)
                                            {
                                                bdList.Add(sss);
                                                totalBD = Convert.ToInt32(sss.Split(',')[3]);
                                            }
                                        }
                                        
                                        if ((gpList.Count>0 &&gpList.Count == gpMessCount) && (bdList.Count>0) && bdList.Count == bdMessCount)
                                        {                                            
                                            if (!drawed)
                                            {
                                                drawed = true;
                                                try
                                                {
                                                    lock (obj)
                                                    {
                                                        
                                                        StatusCtrlForm.statusCtrlForm.Refresh();
                                                    }

                                                }
                                                catch (Exception ex)
                                                {
                                                    LogHelper.WriteInfoLog(MethodBase.GetCurrentMethod().DeclaringType, "draw gsv error:" + ex.Message);
                                                }
                                            }
                                        }                                        
                                    }                                   

                                }
                                if (drawed && gga && rmc)
                                {
                                    break;
                                }

                            }
                            break;
                        }
                    }
                    count++;
                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteInfoLog(MethodBase.GetCurrentMethod().DeclaringType, "exeSatellite error:" + ex.Message);
            }
        }

        
        private static string getMJD(string ys, string ms, string ds)
        {
            try
            {
                int y = Convert.ToInt32(ys) - 1900;
                int m = Convert.ToInt32(ms);
                int d = Convert.ToInt32(ds);
                int L = 0;
                if (m == 1 || m == 2) L = 1;
                int njdINT = 14956 + d + (int)((y - L) * 365.25) + (int)((m + 1 + L * 12) * 30.6001);
                return njdINT + "";
            }
            catch (Exception ex)
            {
                LogHelper.WriteInfoLog(MethodBase.GetCurrentMethod().DeclaringType, "getMJD error:" + ex.Message);
                return "";
            }
        }

        private static string parseGGA(string ggaStr)
        {
            try
            {
                double f = 1 / 298.257223563;                   /*基准椭球体的极扁率*/
                double a = 6378137.0;                              /*基准椭球体的长半径*/
                double b = 6356752.314;                            /*基准椭球体的短半径*/
                double e2 = f * (2 - f);                                /*基准椭球体的偏心率*/
                double pi_180 = Math.PI / 180;
                //$GPGGA,081918.00,3954.7889938,N,11615.5667600,E,1,28,0.68,78.6748,M,-9.7970,M,02,*7D
                var arr = ggaStr.Split(',');

                string m_pBs = parseCoord(arr[2], arr[3]);
                string m_pLs = parseCoord(arr[4], arr[5]);
                string m_pHs = "";
                if (!arr[9].Equals("")&& !arr[11].Equals("")) m_pHs = Convert.ToDouble(arr[9]) + Convert.ToDouble(arr[11]) + "";// add 大地水准面高度 纠正误差
                                                                                                                                //		objBLH.b = util.parseCoord(arr[2],arr[3]);
                                                                                                                                //		objBLH.l = util.parseCoord(arr[4],arr[5]);

                //		objBLH.h = parseFloat(arr[9]);
                string X = "", Y = "", Z = "";
                if (!m_pBs.Equals("") && !m_pLs.Equals("") && !m_pHs.Equals(""))
                {                    
                    double m_pB = Convert.ToDouble(m_pBs);
                    double m_pL = Convert.ToDouble(m_pLs);
                    double m_pH = Convert.ToDouble(m_pHs);
                    double N = a / Math.Sqrt(1 - e2 * Math.Sin(m_pB * pi_180) * Math.Sin(m_pB * Math.PI));
                    X = (N + m_pH) * Math.Cos(m_pB * pi_180) * Math.Cos(m_pL * Math.PI) + "";
                    Y = (N + m_pH) * Math.Cos(m_pB * pi_180) * Math.Sin(m_pL * Math.PI) + "";
                    Z = (N * (1 - e2) + m_pH) * Math.Sin(m_pB * pi_180) + "";
                }
                return X + "," + Y + "," + Z;
            }
            catch (Exception ex)
            {
                LogHelper.WriteInfoLog(MethodBase.GetCurrentMethod().DeclaringType, "parseGGA error:" + ex.Message);
                return " , , ";
            }
        }
	    private static string parseCoord (string coord, string dir)
        {
            //$GPGGA,081918.00,3954.7889938,N,11615.5667600,E,1,28,0.68,78.6748,M,-9.7970,M,02,*7D		
            if ( coord.Equals(""))
                return null;
            int n=1, sgn = 1;
            switch (dir)
            {
                case "S":
                    sgn = -1; break;
                case "N":
                    n = 2;break;
                case "W":
                    sgn = -1; break;
                case "E":
                    n = 3; break;

                default: break;
            }
            return sgn * (Convert.ToDouble(coord.Substring(0, n)) + Convert.ToDouble(coord.Substring(n)) / 60) + "";
        }
        private  string BLH2XYX (string objectBLH)
        {
            //		var objectBLH ={l:116.259446,b:39.91314989666667,h:78.6748};//for test
            //	    var N = a / Math.sqrt(1 - e2 * Math.sin(objectBLH.b * pi_180) * Math.sin(objectBLH.b * pi_180));
            //	    var X = (N + objectBLH.h) * Math.cos(objectBLH.b * pi_180) * Math.cos(objectBLH.l * pi_180);
            //	    var Y = (N + objectBLH.h) * Math.cos(objectBLH.b * pi_180) * Math.sin(objectBLH.l * pi_180);
            //	    var Z = [N * (1 - e2 ) + objectBLH.h] * Math.sin(objectBLH.b * pi_180);
            //	    var objectXYZ = {};
            //	    objectXYZ.X = X;
            //	    objectXYZ.Y = Y;
            //	    objectXYZ.Z = Z;
            string X="", Y="", Z = "";
            double m_pB = Convert.ToDouble(objectBLH.Split(',')[0]);
            double m_pL = Convert.ToDouble(objectBLH.Split(',')[1]);
            double m_pH = Convert.ToDouble(objectBLH.Split(',')[2]);
            //double N = a / Math.Sqrt(1 - e2 * Math.Sin(m_pB * pi_180) * Math.Sin(m_pB * Math.PI));
            //X = (N + m_pH) * Math.Cos(m_pB * pi_180) * Math.Cos(m_pL * Math.PI);
            //Y = (N + m_pH) * Math.Cos(m_pB * pi_180) * Math.Sin(m_pL * Math.PI);
            //Z = [N * (1 - e2) + m_pH] * Math.Sin(m_pB * pi_180);
            
            return X+","+Y+","+Z;
        }
                
    }

}