using MegaRobo.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Common.DevicesModels
{
    public abstract class DrainageFluidBaseProp
    {
        [Numeric(Minimum = 15200, Maximum = 33700, Default = 33700, Descr = "分液Z轴驱动位置")]
        public uint za { get; set; } = 33700;

        //33700	15100..33700	液体出现的绝对位置
        [Numeric(Minimum = 15200, Maximum = 33700, Default = 33700, Descr = "离开液面时的绝对位置")]
        public uint zb { get; set; } = 33700;

        //	00000..20000	此参数根据所提供的步骤数定义下面的液体。
        [Numeric(Minimum = 0, Maximum = 20000, Default = 200, Descr = "液面跟随步长(Z轴驱动[增量])")]
        public uint ze { get; set; } = 200;

        //	00000..20000	容器底部的高度，从“zh”[增量]测量
        [Numeric(Minimum = 0, Maximum = 20000, Default = 0, Descr = "容器底部的高度，从“zh”[增量]测量")]
        public uint zk { get; set; }

        //	00000..10000	容器底部部分此参数描述了管底部的几何形状（图11）。gx=10‘000为平底gx=0为圆锥形底部gx=6’180为圆底
        [Numeric(Minimum = 0, Maximum = 10000, Default = 10000, Descr = "容器底部几何形状 gx = 10000为平底 0为圆锥形底部 6180为圆底")]
        public uint gx { get; set; } = 10000;

        //15100	15100..33700	此参数定义了容器底部的z形位置。它对应于最大的浸泡位置。如果LLD模式处于激活状态，则将搜索液位直到此位置（图12）。
        [Numeric(Minimum = 15200, Maximum = 33700, Default = 33700, Descr = "容器底部Z值")]
        public uint zh { get; set; } = 15200;

        //33700	15100..33700	结束遍历位置。在命令结尾处的横向位置。
        [Numeric(Minimum = 15200, Maximum = 33700, Default = 33700, Descr = "结束遍历位置")]
        public uint zg { get; set; } = 33700;

        //	0000..9999	运输空气量[增量]空气在吸入或分配结束时被吸入，并在接下来的分配步骤中自动作为额外的量再次分配。它受到尖端几何形状和液体蒸汽压的影响。防止在运输过程中产生液滴的形成。这个参数在移液挥发性物质时很有用。
        [Numeric(Minimum = 0, Maximum = 9999, Default = 200, Descr = "运输空气量[增量]")]
        public uint dg { get; set; } = 200;

        //public uint zq { get; set; } = 280;
        //	000..999	吸入后在液体中停留的时间[1/10秒]此参数设置吸入后尖端或离开液体前在液体中停留的时间。在设置该参数时，考虑了尖端的几何形状和液体粘度。如果沉淀时间太短，液体没有足够的时间来填充尖端，一旦尖端离开液体，不需要的空气就会被吸入。
        [Numeric(Minimum = 0, Maximum = 999, Default = 10, Name = "ML", Index = 9, Descr = "吸入后在液体中停留的时间[1/10秒]")]
        public uint to { get; set; } = 10;

        //22350	00020..56000	流量，【增加量/秒】。该参数对应于吸入或分配期间的柱塞速度。流量是最关键的参数，受尖端几何形状，液体粘度、密度和蒸汽压力：小尖端开放->慢流速，高粘度->慢流速，高密度->慢流速，高蒸汽压->快速流速
        [Numeric(Minimum = 20, Maximum = 56000, Default = 22350, Name = "ML", Index = 10, Descr = "分液速度，流量，【增加量/秒】")]
        public uint dv { get; set; } = 22350;

        //5600	00000..56000	停止流量停止分配的柱塞的分配速度。如果等于“流量”，则柱塞突然停止而不减速。如果设置为最小值，柱塞的运动会逐渐减慢，直到停止。移液粘性液体如甘油时，建议逐步停止（缓慢停止流量）以完成分配。
        //[Numeric(Minimum = 00, Maximum = 56000, Default = 5600, Name = "MH", Index = 21, Descr = "停止流量停止分配的柱塞的分配速度")]
        [Numeric(Minimum = 00, Maximum = 56000, Default = 5600, Name = "ML", Index = 11, Descr = "停止流量，停止分配的柱塞的分配速度")]
        public uint du { get; set; } = 5600;

        //400	005..600	加速分配驱动器[1000增量/秒2]设置分配期间柱塞的加速度。需要控制流量切断。防止在尖端孔口处形成液滴
        //[Numeric(Minimum = 5, Maximum = 600, Default = 400, Name = "MH", Index = 22, Descr = "加速分配驱动器[1000增量/秒2]")]
        [Numeric(Minimum = 5, Maximum = 600, Default = 400, Name = "ML", Index = 12, Descr = "加速分配驱动器[1000增量/秒2]")]
        public uint dr { get; set; } = 400;

        //1000	00020..15000	交换速度[增量/秒]决定了抽吸或分配后尖端从液体中抽出的速度。该参数是根据液体的粘度和蒸汽压来选择的。使用较慢的速度可以防止粘性液体粘附在尖端的外部。
        //[Numeric(Minimum = 20, Maximum = 15000, Default = 1000, Name = "MH", Index = 23, Descr = "抽吸或分配后尖端从液体中抽出的速度交换速度[增量/秒]")]
        [Numeric(Minimum = 20, Maximum = 15000, Default = 5000, Name = "ML", Index = 13, Descr = "抽吸或分配后尖端从液体中抽出的速度交换速度[增量/秒]")]
        public uint zu { get; set; } = 5000;
    }

    //分液(清空用ML，一吸多分用MH)
    /// <summary>
    /// 分液清空
    /// </summary>
    public class DrainageFluidByML : DrainageFluidBaseProp
    {
        public string CmdCode = "ML";
    }

    /// <summary>
    /// 一吸多分
    /// </summary>
    public class DrainageFluidByMH : DrainageFluidBaseProp
    {
        public string CmdCode = "MH";

        //	000000..125400	分液量
        [Numeric(Minimum = 0, Maximum = 125400, Default = 0, Name = "MH", Index = 1, Descr = "分液量")]
        public uint db { get; set; }

        //	000..999	停止后退容积【增量】分配后立即再次吸入该空气量，以突然切断液体流动（仅限喷射部分模式）。移液乙醇等挥发性液体时防止液滴形成。
        [Numeric(Minimum = 0, Maximum = 999, Default = 0, Name = "MH", Index = 2, Descr = "停止后退容积")]
        public uint dd { get; set; }


        //0..1	防液滴控制（ADC；0=关闭，1=开启）。在使用具有低粘度和高蒸汽压的移液液体时，应使用ADC，如乙醇。如果压力达到可能发生液滴的临界值，则尽可能多地抽出柱塞，以降低压力并防止液滴的形成。
        [Numeric(Minimum = 0, Maximum = 1, Default = 0, Name = "MH", Index = 12, Descr = "防液滴控制（ADC；0=关闭，1=开启）")]
        public uint bl { get; set; } = 1;

        //	000000..125400	混合体积[增量】这是混合探头所需的体积。
        [Numeric(Minimum = 0, Maximum = 125400, Default = 0, Name = "MH", Index = 13, Descr = "混合体积[增量】这是混合探头所需的体积。")]
        public uint dm { get; set; }

        //	00..99	混合循环。混合循环次数。
        [Numeric(Minimum = 0, Maximum = 99, Default = 0, Name = "MH", Index = 14, Descr = "混合循环。混合循环次数。")]
        public uint dn { get; set; }

        //	00000..20000	表面进行混合体积的以下步骤。请参见“zd”参数的说明
        [Numeric(Minimum = 0, Maximum = 20000, Default = 0, Name = "MH", Index = 15, Descr = "表面进行混合体积的以下步骤。请参见“zd”参数的说明")]
        public uint zy { get; set; }

        //22350	00020..56000	混合流量这是混合探头时的流量。
        [Numeric(Minimum = 20, Maximum = 56000, Default = 0, Name = "MH", Index = 16, Descr = "混合流量这是混合探头时的流量。")]
        public uint _do { get; set; } = 22350;

        //0..1	设置搜索底部模式 (zm0 = off, zm1 = on)
        [Numeric(Minimum = 0, Maximum = 1, Default = 0, Name = "MH", Index = 17, Descr = "设置搜索底部模式 (zm0 = off, zm1 = on)")]
        public uint zm { get; set; } = 0;

        //186	000..500	开始高度底部搜索开始位置=参数zh+参数zx
        [Numeric(Minimum = 0, Maximum = 500, Default = 0, Name = "MH", Index = 18, Descr = "开始高度底部搜索开始位置=参数zh+参数zx")]
        public uint zx { get; set; } = 186;

        //	0000..9999	底部搜索后的分配高度
        [Numeric(Minimum = 0, Maximum = 9999, Default = 0, Name = "MH", Index = 19, Descr = "底部搜索后的分配高度")]
        public uint zo { get; set; }
    }

}
