using System;
using System.Collections.Generic;
using CRVM.Entity;

namespace CRVM.CIDExcuter
{
    //[DataContract]
    public class Stand
    {

        public double[] vib { get; set; }
        public double[] vibLow { get; set; }
        public double[] vibMid { get; set; }
        public double[] vibHig { get; set; }

        //分频段能量、速度       
        public double energy_All { get; set; }
        public double energy_L { get; set; }
        public double energy_M { get; set; }
        public double energy_H { get; set; }
        public double speed { get; set; }



        //用于绘制时域曲线
        public double[] tVib { get; set; }


        //用于绘制能量曲线
        public RollingArray<double> list_Energy_All { get; set; }
        public RollingArray<double> list_Energy_L { get; set; }
        public RollingArray<double> list_Energy_M { get; set; }
        public RollingArray<double> list_Energy_H { get; set; }
        public RollingArray<double> list_Energy_Speed { get; set; }

        //用于绘制报警线

        public RollingArray<double> list_Alarm_L { set; get; }
        public RollingArray<double> list_Alarm_M { set; get; }
        public RollingArray<double> list_Alarm_H { set; get; }

        //用于绘制缺陷线
        public RollingArray<double> list_Defect_L { set; get; }
        public RollingArray<double> list_Defect_M { set; get; }
        public RollingArray<double> list_Defect_H { set; get; }

        #region 报警参数插值算法
        private EntityAlarmSpeed[] _alarm_spd = new EntityAlarmSpeed[10];

        public EntityAlarmSpeed[] alarm_spd
        {
            get { return _alarm_spd; }
            set { _alarm_spd = value; }
        }
        public int[] fre_l_S1 { get; set; }
        public int[] fre_l_S2 { get; set; }
        public double[] fre_l_V { get; set; }
        public double[] fre_l_D { get; set; }
        public int[] fre_m_S1 { get; set; }
        public int[] fre_m_S2 { get; set; }
        public double[] fre_m_V { get; set; }
        public double[] fre_m_D { get; set; }
        public int[] fre_h_S1 { get; set; }
        public int[] fre_h_S2 { get; set; }
        public double[] fre_h_V { get; set; }
        public double[] fre_h_D { get; set; }

        public void SetAlarmFred(EntityAlarmSpeed[] alarmspd)
        {
            _alarm_spd = alarmspd;
            if (_alarm_spd != null)
            {
                if (_alarm_spd.Length <= 1)
                {
                    fre_l_S1 = new int[1];
                    fre_l_S2 = new int[1];
                    fre_l_V = new double[1];
                    fre_l_D = new double[1];
                    fre_m_S1 = new int[1];
                    fre_m_S2 = new int[1];
                    fre_m_V = new double[1];
                    fre_m_D = new double[1];
                    fre_h_S1 = new int[1];
                    fre_h_S2 = new int[1];
                    fre_h_V = new double[1];
                    fre_h_D = new double[1];
                    fre_l_S1[0] = _alarm_spd[0].lowPassL;
                    fre_l_S2[0] = _alarm_spd[0].lowPassU;
                    fre_l_V[0] = _alarm_spd[0].lowAlarmValue;
                    fre_l_D[0] = _alarm_spd[0].lowDefectValue;
                    fre_m_S1[0] = _alarm_spd[0].midPassL;
                    fre_m_S2[0] = _alarm_spd[0].midPassU;
                    fre_m_V[0] = _alarm_spd[0].midAlarmValue;
                    fre_m_D[0] = _alarm_spd[0].midDefectValue;
                    fre_h_S1[0] = _alarm_spd[0].highPassL;
                    fre_h_S2[0] = _alarm_spd[0].highPassU;
                    fre_h_V[0] = _alarm_spd[0].highAlarmValue;
                    fre_h_D[0] = _alarm_spd[0].highDefectValue;
                }
                else
                {
                    int iIndCount = _alarm_spd[_alarm_spd.Length - 1].alarmSpeed - _alarm_spd[0].alarmSpeed + 1;

                    fre_l_S1 = new int[iIndCount];
                    fre_l_S2 = new int[iIndCount];
                    fre_l_V = new double[iIndCount];
                    fre_l_D = new double[iIndCount];
                    fre_m_S1 = new int[iIndCount];
                    fre_m_S2 = new int[iIndCount];
                    fre_m_V = new double[iIndCount];
                    fre_m_D = new double[iIndCount];
                    fre_h_S1 = new int[iIndCount];
                    fre_h_S2 = new int[iIndCount];
                    fre_h_V = new double[iIndCount];
                    fre_h_D = new double[iIndCount];

                    fre_l_S1[0] = _alarm_spd[0].lowPassL;
                    fre_l_S2[0] = _alarm_spd[0].lowPassU;
                    fre_l_V[0] = _alarm_spd[0].lowAlarmValue;
                    fre_l_D[0] = _alarm_spd[0].lowDefectValue;
                    fre_m_S1[0] = _alarm_spd[0].midPassL;
                    fre_m_S2[0] = _alarm_spd[0].midPassU;
                    fre_m_V[0] = _alarm_spd[0].midAlarmValue;
                    fre_m_D[0] = _alarm_spd[0].midDefectValue;
                    fre_h_S1[0] = _alarm_spd[0].highPassL;
                    fre_h_S2[0] = _alarm_spd[0].highPassU;
                    fre_h_V[0] = _alarm_spd[0].highAlarmValue;
                    fre_h_D[0] = _alarm_spd[0].highDefectValue;

                    int i_start_l_s1 = _alarm_spd[0].lowPassL;
                    int i_start_l_s2 = _alarm_spd[0].lowPassU;
                    double i_start_l_v = _alarm_spd[0].lowAlarmValue;
                    double i_start_l_d = _alarm_spd[0].lowDefectValue;
                    int i_start_m_s1 = _alarm_spd[0].midPassL;
                    int i_start_m_s2 = _alarm_spd[0].midPassU;
                    double i_start_m_v = _alarm_spd[0].midAlarmValue;
                    double i_start_m_d = _alarm_spd[0].midDefectValue;
                    int i_start_h_s1 = _alarm_spd[0].highPassL;
                    int i_start_h_s2 = _alarm_spd[0].highPassU;
                    double i_start_h_v = _alarm_spd[0].highAlarmValue;
                    double i_start_h_d = _alarm_spd[0].highDefectValue;
                    int i_start_spd = _alarm_spd[0].alarmSpeed;

                    int i_end_l_s1, i_end_l_s2, i_end_m_s1, i_end_m_s2, i_end_h_s1, i_end_h_s2, i_end_spd;
                    double i_end_l_v, i_end_m_v, i_end_h_v, i_end_l_d, i_end_m_d, i_end_h_d;
                    double i_step_l_s1, i_step_l_s2, i_step_l_v, i_step_l_d, i_step_m_s1, i_step_m_s2, i_step_m_v, i_step_m_d, i_step_h_s1, i_step_h_s2, i_step_h_v, i_step_h_d;
                    int i_sub_tmp = 0;
                    int i_index = 0;
                    for (int i = 1; i < _alarm_spd.Length; i++)
                    {
                        i_end_l_s1 = _alarm_spd[i].lowPassL;
                        i_end_l_s2 = _alarm_spd[i].lowPassU;
                        i_end_l_v = _alarm_spd[i].lowAlarmValue;
                        i_end_l_d = _alarm_spd[i].lowDefectValue;
                        i_end_m_s1 = _alarm_spd[i].midPassL;
                        i_end_m_s2 = _alarm_spd[i].midPassU;
                        i_end_m_v = _alarm_spd[i].midAlarmValue;
                        i_end_m_d = _alarm_spd[i].midDefectValue;
                        i_end_h_s1 = _alarm_spd[i].highPassL;
                        i_end_h_s2 = _alarm_spd[i].highPassU;
                        i_end_h_v = _alarm_spd[i].highAlarmValue;
                        i_end_h_d = _alarm_spd[i].highDefectValue;

                        i_end_spd = _alarm_spd[i].alarmSpeed;
                        i_sub_tmp = i_end_spd - i_start_spd;
                        i_step_l_s1 = ((i_end_l_s1 - i_start_l_s1) / (i_sub_tmp * 1.0f));
                        i_step_l_s2 = ((i_end_l_s2 - i_start_l_s2) / (i_sub_tmp * 1.0f));
                        i_step_l_v = ((i_end_l_v - i_start_l_v) / (i_sub_tmp * 1.0f));
                        i_step_l_d = ((i_end_l_d - i_start_l_d) / (i_sub_tmp * 1.0f));
                        i_step_m_s1 = ((i_end_m_s1 - i_start_m_s1) / (i_sub_tmp * 1.0f));
                        i_step_m_s2 = ((i_end_m_s2 - i_start_m_s2) / (i_sub_tmp * 1.0f));
                        i_step_m_v = ((i_end_m_v - i_start_m_v) / (i_sub_tmp * 1.0f));
                        i_step_m_d = ((i_end_m_d - i_start_m_d) / (i_sub_tmp * 1.0f));
                        i_step_h_s1 = ((i_end_h_s1 - i_start_h_s1) / (i_sub_tmp * 1.0f));
                        i_step_h_s2 = ((i_end_h_s2 - i_start_h_s2) / (i_sub_tmp * 1.0f));
                        i_step_h_v = ((i_end_h_v - i_start_h_v) / (i_sub_tmp * 1.0f));
                        i_step_h_d = ((i_end_h_d - i_start_h_d) / (i_sub_tmp * 1.0f));

                        for (int k = 1; k <= i_sub_tmp; k++)
                        {
                            fre_l_S1[k + i_index] = Convert.ToInt32(i_start_l_s1 + i_step_l_s1 * (k - 1));
                            fre_l_S2[k + i_index] = Convert.ToInt32(i_start_l_s2 + i_step_l_s2 * (k - 1));
                            fre_l_V[k + i_index] = (i_start_l_v + i_step_l_v * (k - 1));
                            fre_l_D[k + i_index] = (i_start_l_d + i_step_l_d * (k - 1));
                            fre_m_S1[k + i_index] = Convert.ToInt32(i_start_m_s1 + i_step_m_s1 * (k - 1));
                            fre_m_S2[k + i_index] = Convert.ToInt32(i_start_m_s2 + i_step_m_s2 * (k - 1));
                            fre_m_V[k + i_index] = (i_start_m_v + i_step_m_v * (k - 1));
                            fre_m_D[k + i_index] = (i_start_m_d + i_step_m_d * (k - 1));
                            fre_h_S1[k + i_index] = Convert.ToInt32(i_start_h_s1 + i_step_h_s1 * (k - 1));
                            fre_h_S2[k + i_index] = Convert.ToInt32(i_start_h_s2 + i_step_h_s2 * (k - 1));
                            fre_h_V[k + i_index] = (i_start_h_v + i_step_h_v * (k - 1));
                            fre_h_D[k + i_index] = (i_start_h_d + i_step_h_d * (k - 1));
                        }

                        i_start_l_s1 = i_end_l_s1;
                        i_start_l_s2 = i_end_l_s2;
                        i_start_l_v = i_end_l_v;
                        i_start_l_d = i_end_l_d;
                        i_start_m_s1 = i_end_m_s1;
                        i_start_m_s2 = i_end_m_s2;
                        i_start_m_v = i_end_m_v;
                        i_start_m_d = i_end_m_d;
                        i_start_h_s1 = i_end_h_s1;
                        i_start_h_s2 = i_end_h_s2;
                        i_start_h_v = i_end_h_v;
                        i_start_h_d = i_end_h_d;
                        i_start_spd = i_end_spd;

                        i_index += i_sub_tmp;

                        fre_l_S1[i_index] = _alarm_spd[i].lowPassL;
                        fre_l_S2[i_index] = _alarm_spd[i].lowPassU;
                        fre_l_V[i_index] = _alarm_spd[i].lowAlarmValue;
                        fre_l_D[i_index] = _alarm_spd[i].lowDefectValue;
                        fre_m_S1[i_index] = _alarm_spd[i].midPassL;
                        fre_m_S2[i_index] = _alarm_spd[i].midPassU;
                        fre_m_V[i_index] = _alarm_spd[i].midAlarmValue;
                        fre_m_D[i_index] = _alarm_spd[i].midDefectValue;
                        fre_h_S1[i_index] = _alarm_spd[i].highPassL;
                        fre_h_S2[i_index] = _alarm_spd[i].highPassU;
                        fre_h_V[i_index] = _alarm_spd[i].highAlarmValue;
                        fre_h_D[i_index] = _alarm_spd[i].highDefectValue;
                    }

                    fre_l_S1[iIndCount - 1] = _alarm_spd[_alarm_spd.Length - 1].lowPassL;
                    fre_l_S2[iIndCount - 1] = _alarm_spd[_alarm_spd.Length - 1].lowPassU;
                    fre_l_V[iIndCount - 1] = _alarm_spd[_alarm_spd.Length - 1].lowAlarmValue;
                    fre_l_D[iIndCount - 1] = _alarm_spd[_alarm_spd.Length - 1].lowDefectValue;
                    fre_m_S1[iIndCount - 1] = _alarm_spd[_alarm_spd.Length - 1].midPassL;
                    fre_m_S2[iIndCount - 1] = _alarm_spd[_alarm_spd.Length - 1].midPassU;
                    fre_m_V[iIndCount - 1] = _alarm_spd[_alarm_spd.Length - 1].midAlarmValue;
                    fre_m_D[iIndCount - 1] = _alarm_spd[_alarm_spd.Length - 1].midDefectValue;
                    fre_h_S1[iIndCount - 1] = _alarm_spd[_alarm_spd.Length - 1].highPassL;
                    fre_h_S2[iIndCount - 1] = _alarm_spd[_alarm_spd.Length - 1].highPassU;
                    fre_h_V[iIndCount - 1] = _alarm_spd[_alarm_spd.Length - 1].highAlarmValue;
                    fre_h_D[iIndCount - 1] = _alarm_spd[_alarm_spd.Length - 1].highDefectValue;
                }
            }
        }

        #endregion

        #region  报警参数

        //分频频率范围
        public int band_Fre_L1 { get; set; }
        public int band_Fre_L2 { get; set; }
        public int band_Fre_M1 { get; set; }
        public int band_Fre_M2 { get; set; }
        public int band_Fre_H1 { get; set; }
        public int band_Fre_H2 { get; set; }


        //报警参考值
        public double alarm_L_Value_ck { get; set; }
        public double alarm_M_Value_ck { get; set; }
        public double alarm_H_Value_ck { get; set; }

        public double defect_L_Value_ck { get; set; }
        public double defect_M_Value_ck { get; set; }
        public double defect_H_Value_ck { get; set; }
        //报警参考次数
        public int alarm_L_Times_ck { get; set; }
        public int alarm_M_Times_ck { get; set; }
        public int alarm_H_Times_ck { get; set; }

        //记录能量值超过报警线次数
        public int alarm_L_Times { get; set; }
        public int alarm_M_Times { get; set; }
        public int alarm_H_Times { get; set; }


        public class AlarmInfo
        {
            public DateTime time { set; get; }
            public int startPos { set; get; }
            public int endPos { set; get; }
            public double value { set; get; }
        }
        public int tempAlarmLowInfostart { set; get; }
        public int tempAlarmMidInfostart { set; get; }
        public int tempAlarmHighInfostart { set; get; }

        public List<AlarmInfo> alarmLowInfo = new List<AlarmInfo>();
        public List<AlarmInfo> alarmMidInfo = new List<AlarmInfo>();
        public List<AlarmInfo> alarmHighInfo = new List<AlarmInfo>();



        //统计报警次数
        public int indexLow { get; set; }
        public int indexMid { get; set; }
        public int indexHigh { get; set; }

        #endregion

        public double rollDiameterBU { set; get; }
        public double rollDiameterBL { set; get; }
        public double rollDiameterMU { set; get; }
        public double rollDiameterML { set; get; }
        public double rollDiameterWU { set; get; }
        public double rollDiameterWL { set; get; }

        public void Initial(int vibLength, int tvibLength, int energyLength)
        {
            vib = new double[vibLength];
            vibLow = new double[vibLength];
            vibMid = new double[vibLength];
            vibHig = new double[vibLength];
            tVib = new double[tvibLength];

            list_Energy_Speed = new RollingArray<double>(energyLength + 1);
            list_Energy_All = new RollingArray<double>(energyLength + 1);
            list_Energy_L = new RollingArray<double>(energyLength + 1);
            list_Energy_M = new RollingArray<double>(energyLength + 1);
            list_Energy_H = new RollingArray<double>(energyLength + 1);

            list_Alarm_L = new RollingArray<double>(energyLength + 1);
            list_Alarm_M = new RollingArray<double>(energyLength + 1);
            list_Alarm_H = new RollingArray<double>(energyLength + 1);

            list_Defect_L = new RollingArray<double>(energyLength + 1);
            list_Defect_M = new RollingArray<double>(energyLength + 1);
            list_Defect_H = new RollingArray<double>(energyLength + 1);
            for (int i = 0; i < energyLength + 1; i++)
            {
                list_Energy_Speed.Add(0.0);
                list_Energy_All.Add(0.0);
                list_Energy_L.Add(0.0);
                list_Energy_M.Add(0.0);
                list_Energy_H.Add(0.0);
                list_Alarm_L.Add(0.0);
                list_Alarm_M.Add(0.0);
                list_Alarm_H.Add(0.0);
                list_Defect_L.Add(0.0);
                list_Defect_M.Add(0.0);
                list_Defect_H.Add(0.0);
            }
        }

    }
}
