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

namespace Common.DevicesModels
{
    public enum SuckMode
    {
        [Description("电容式")]
        MA,
        [Description("电压式")]
        ME,
        [Description("固定高度")]
        MG,
    }

    public enum DrainageMode
    {
        [Description("排空")]
        ML,
        [Description("一吸多分")]
        MH,
    }

    public abstract class SuckFluidBaseProp
    {
        //	000000-125400	吸液量
        [Numeric(Minimum = 0, Maximum = 125400, Descr = "吸液量ul")]
        public uint da { get; set; }

        //	0000-9999	过度吸气量[增量]
        [Numeric(Minimum = 0, Maximum = 9999, Descr = "过度吸气量")]
        public uint dc { get; set; } = 100;

        //	00000-20000	液面以下高度
        [Numeric(Minimum = 0, Maximum = 20000, Descr = "吸液跟随下降高度")]
        public uint zd { get; set; } = 200;

        //	00000..20000	容器底部的高度
        [Numeric(Minimum = 0, Maximum = 20000, Descr = "容器底部几何形状的高度 平底为 0 ")]
        public uint zk { get; set; } = 0; //600

        //	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; //6180;

        //15200	15100..33700	容器底部的位置。
        [Numeric(Minimum = 15200, Maximum = 33700, Descr = "容器底部位置")]
        public uint zh { get; set; } = 15200;

        //33700	15100..33700	LLD搜索位置
        [Numeric(Minimum = 15200, Maximum = 33700, Default = 33700, Descr = "LLD搜索位置,吸液位置")]
        public uint zc { get; set; } = 26000;

        //	0000..9999	渗透深度增加了液体表面以下尖端的渗透深度。
        [Numeric(Minimum = 0, Maximum = 9999, Default =8, Descr = "浸入液面高度")]
        public uint zi { get; set; } = 8U; //探入液面高度，Tip头进入液面

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

        //0	000000..125400	排气空气量在吸入过程中首先吸收该空气量。它在分配结束时被吹掉。它受到液体粘度和蒸气压的影响。爆裂的体积有助于完全清空尖端
        [Numeric(Minimum = 0, Maximum = 125400, Default = 0, Descr = "排气空气量在吸入过程中首先吸收该空气量")]
        public uint df { get; set; } = 500;

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

        //280	0000..9999	离开高度[增加*]高度超过液体表面，在此期间，宙斯驱动缓慢地穿透或离开液体。
        [Numeric(Minimum = 0, Maximum = 9999, Default = 280, Descr = "离开液面高度")]
        public uint zq { get; set; } = 280;

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

        //0..1	吸气模式(dj0=简单，dj1=空杯)
        [Numeric(Minimum = 0, Maximum = 1, Descr = "吸气模式(dj0=简单，dj1=空杯)")]
        public uint dj { get; set; } = 0;

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

        //0..1	堵塞检测
        [Numeric(Minimum = 0, Maximum = 1, Descr = "堵塞检测")]
        public uint gq { get; set; } = 0;

        //1..4	CLLD灵敏度（1=非常高，高2=，3=培养基，低4=）。灵敏度可以调整到容器尺寸和要检测的液体体积（小体积->高灵敏度）。
        //public uint cs	ps	{get;set;}

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

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

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

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

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

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

    /// <summary>
    /// 通过电容式LLD在液体表面进行搜索的抽吸液体
    /// </summary>
    public class SuckFluidByMA : SuckFluidBaseProp
    {
        public string CmdCode => "MA";

        //1..4	CLLD灵敏度（1=非常高，高2=，3=培养基，低4=）。灵敏度可以调整到容器尺寸和要检测的液体体积（小体积->高灵敏度）。
        [Numeric(Minimum = 1, Maximum = 4, Default = 2, Descr = "CLLD灵敏度")]
        public uint cs { get; set; } = 1;
    }

    /// <summary>
    /// 通过压力式LLD在液体表面进行搜索的抽吸液体
    /// </summary>
    public class SuckFluidByME : SuckFluidBaseProp
    {
        public string CmdCode => "ME";

        //1..4	pLLD灵敏度（1=非常高，高2=，3=一般，低4=）。灵敏度可以调整到容器尺寸和要检测的液体体积（小体积->高灵敏度）。
        [Numeric(Minimum = 1, Maximum = 4, Default = 2, Descr = "pLLD灵敏度(压力探测灵敏度)")]
        public uint ps { get; set; } = 1;
    }

    /// <summary>
    /// 固定位置吸液
    /// </summary>
    public class SuckFluidByMG
    {
        public string CmdCode => "MG";

        [Numeric(Minimum = 0, Maximum = 125400, Descr = "吸液量")]
        public uint da { get; set; }

        [Numeric(Minimum = 0, Maximum = 9999, Default =100, Descr = "过度吸气量")]
        public uint dc { get; set; } = 100;

        [Numeric(Minimum = 15200, Maximum = 33700, Default = 33700, Descr = "吸液时Z轴高度")]
        public uint za { get; set; } = 33700;

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

        [Numeric(Minimum = 0, Maximum = 20000, Default = 200, Descr = "吸液跟随下降高度")]
        public uint zd { get; set; } = 200;

        [Numeric(Minimum = 0, Maximum = 20000, Default = 0, Descr = "容器尾部几何形状与底部的高度 平底为0")]
        public uint zk { get; set; } = 0;

        //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; //6180;

        //15200	15100..33700	容器底部的位置。
        [Numeric(Minimum = 15200, Maximum = 33700, Descr = "容器底部位置")]
        public uint zh { get; set; } = 15200;

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

        //0	000000..125400	排气空气量在吸入过程中首先吸收该空气量。它在分配结束时被吹掉。它受到液体粘度和蒸气压的影响。爆裂的体积有助于完全清空尖端
        [Numeric(Minimum = 0, Maximum = 125400, Default = 500, Descr = "排气空气量在吸入过程中首先吸收该空气量")]
        public uint df { get; set; } = 500;

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

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

        //0..1	吸气模式(dj0=简单，dj1=空杯)
        [Numeric(Minimum = 0, Maximum = 1, Descr = "吸气模式(dj0=简单，dj1=空杯)")]
        public uint dj { get; set; } = 0;

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

        //0..1	堵塞检测
        [Numeric(Minimum = 0, Maximum = 1, Descr = "堵塞检测")]
        public uint gq { get; set; }

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

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

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

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

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

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