using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Threading;
using System.Collections.Concurrent;
using System.Diagnostics;
using System.Threading.Tasks;
using BPASmartClient.Device;
using BPA.Message.Enum;
using BPA.Message;
using BPASmartClient.Helper;
using BPASmartClient.Model.咖啡机.Enum;
using BPASmartClient.Model;
using BPASmartClient.EventBus;
using static BPASmartClient.EventBus.EventBus;
using BPASmartClient.Model.PLC;
using BPASmartClient.Model.单片机;
using BPASmartClient.Message;

namespace BPASmartClient.MorktJAKAJC
{
    public class Control_MORKJC : BaseDevice
    {
        GVL_MORKJC morkTJakaJC = new GVL_MORKJC();
        //物料存放位置
        private Dictionary<string, PolymerBatching> batchings = new Dictionary<string, PolymerBatching>();
        //容器位置
        private string holderLoc;
        //主料位置
        private string mainMaterialLoc;
        public override global::BPA.Message.Enum.DeviceClientType DeviceType { get { return BPA.Message.Enum.DeviceClientType.MORKT; } }
        /// <summary>
        /// 果汁机做法，true:热饮，false:冷饮
        /// </summary>
        private bool GuMake = false;

        private void OrderChange(string subid, ORDER_STATUS oRDER_STATUS)
        {
            EventBus.EventBus.GetInstance().Publish(new OrderStatusChangedEvent() { Status = oRDER_STATUS, SubOrderId = subid, deviceClientType = DeviceType });
        }
        public override void DoMain()
        {
            if (Json<KeepDataBase>.Data.IsVerify)
            {
                IsHealth = true;
            }
            IsHealth = true;
            serverInit();
            DataParse();
        }

        private void serverInit()
        {
            EventBus.EventBus.GetInstance().Subscribe<MaterialDeliveryEvent>(DeviceId, delegate (IEvent @event, EventCallBackHandle callBack)
            {
                if (@event == null) return;
                if (@event is MaterialDeliveryEvent material)
                {
                    orderMaterialDelivery = material.orderMaterialDelivery;
                }
            });
        }

        private void DataParse()
        {
            EventBus.EventBus.GetInstance().Subscribe<DoOrderEvent>(DeviceId, delegate (IEvent @event, EventCallBackHandle callBackHandle)
            {
                if (@event == null) return;
                if (@event is DoOrderEvent order)
                {
                    if (order.MorkOrder.GoodBatchings == null) return;
                    OrderCount++;
                    DeviceProcessLogShow($"接收到{OrderCount}次订单");
                    batchings = PolymerBatching.BuildAll();

                    //商品类型
                    GOODS_TYPE currentGoodsType = GOODS_TYPE.NEITHER;

                    foreach (var item in order.MorkOrder.GoodBatchings)
                    {
                        var res = orderMaterialDelivery?.BatchingInfo?.FirstOrDefault(p => p.BatchingId == item.BatchingId);
                        if (res != null)
                        {
                            //验证商品是做的某种饮料
                            if (ValidateGoodsByBatching(res.BatchingLoc) != GOODS_TYPE.NEITHER)
                            {
                                //获取当前物料所属商品类型
                                currentGoodsType = ValidateGoodsByBatching(res.BatchingLoc);
                            }
                            //
                            switch (batchings[res.BatchingLoc].BatchingClass)
                            {
                                case BATCHING_CLASS.HOLDER:
                                    holderLoc = res.BatchingLoc;
                                    break;
                                case BATCHING_CLASS.MAIN_MATERIAL:
                                    mainMaterialLoc = res.BatchingLoc;
                                    break;
                            }
                            //根据商品类型执行具体制作流程
                            switch (currentGoodsType)
                            {
                                case GOODS_TYPE.COFFEE:
                                    if (morkTJakaJC.morkOrderPushesCoffee.FirstOrDefault(p => p.SuborderId == order.MorkOrder.SuborderId) == null)
                                    {
                                        morkTJakaJC.morkOrderPushesCoffee.Enqueue(new OrderLocInfo()
                                        {
                                            SuborderId = order.MorkOrder.SuborderId,
                                            BatchingId = res.BatchingId,
                                            Loc = ushort.Parse(mainMaterialLoc),
                                            GoodName = order.MorkOrder.GoodsName,
                                        });
                                    }
                                    break;
                                case GOODS_TYPE.JUICE:
                                    GuMake = order.MorkOrder.MakeID == "2";//判断果汁的冷热
                                    if (morkTJakaJC.morkOrderPushesJuicer.FirstOrDefault(p => p.SuborderId == order.MorkOrder.SuborderId) == null)
                                    {
                                        morkTJakaJC.morkOrderPushesJuicer.Enqueue(new OrderLocInfo()
                                        {
                                            SuborderId = order.MorkOrder.SuborderId,
                                            BatchingId = res.BatchingId,
                                            Loc = ushort.Parse(mainMaterialLoc),
                                            GoodName = order.MorkOrder.GoodsName,
                                        });
                                    }
                                    break;
                                case GOODS_TYPE.TEA:
                                    if (morkTJakaJC.morkOrderPushesTea.FirstOrDefault(p => p.SuborderId == order.MorkOrder.SuborderId) == null)
                                    {
                                        morkTJakaJC.morkOrderPushesTea.Enqueue(new OrderLocInfo()
                                        {
                                            SuborderId = order.MorkOrder.SuborderId,
                                            BatchingId = res.BatchingId,
                                            Loc = ushort.Parse(mainMaterialLoc),
                                            GoodName = order.MorkOrder.GoodsName,
                                        });
                                    }
                                    break;
                                case GOODS_TYPE.WATER:
                                    if (morkTJakaJC.morkOrderPushesWater.FirstOrDefault(p => p.SuborderId == order.MorkOrder.SuborderId) == null)
                                    {
                                        morkTJakaJC.morkOrderPushesWater.Enqueue(new OrderLocInfo()
                                        {
                                            SuborderId = order.MorkOrder.SuborderId,
                                            BatchingId = res.BatchingId,
                                            Loc = ushort.Parse(mainMaterialLoc),
                                            GoodName = order.MorkOrder.GoodsName,
                                        });
                                    }
                                    break;
                                case GOODS_TYPE.NEITHER:
                                    DeviceProcessLogShow("未知的商品类型");
                                    break;
                            }
                        }
                    }
                }
            });
        }
        private bool bFirstTrig_TeaWater = false;
        private bool bFirstTrig_Coffee = false;
        DateTime delayTimeOut_Coffee;
        private bool bFirstTrig_Juice = false;
        DateTime delayTimeOut_Juice;
        /// <summary>
        /// 判断接咖啡的位置是否有杯子
        /// </summary>
        bool pickUpCoffeeHaveCup = false;
        /// <summary>
        /// 判断接果汁的位置是否有杯子
        /// </summary>
        bool pickUpJuiceHaveCup = false;
        /// <summary>
        /// 判断接开水的位置是否有杯子
        /// </summary>
        bool pickUpHotWaterHaveCup = false;
        public override void MainTask()
        {
            EventBus.EventBus.GetInstance().Subscribe<DRCoffee_CoffeEndCookEvent>(DeviceId, delegate (IEvent @event, EventCallBackHandle callBack)
            {
                if (morkTJakaJC.IsHaveCoffeeCup)
                    morkTJakaJC.MakeCoffeeEnd = true;
            });
            if (pickUpCoffeeHaveCup)
            {
                if (!bFirstTrig_Coffee)
                {
                    bFirstTrig_Coffee = true;
                    delayTimeOut_Coffee = DateTime.Now;
                }
                else if (DateTime.Now.Subtract(delayTimeOut_Coffee).TotalSeconds > 180 && bFirstTrig_Coffee == true)
                {
                    bFirstTrig_Coffee = false;
                    if (morkTJakaJC.IsHaveCoffeeCup)
                        morkTJakaJC.MakeCoffeeEnd = true;
                }
            }
            if (morkTJakaJC.IsHaveJuiceCup)
            {
                var Juicestate = GetStatus<int[]>("GetDeviceStatus");
                if (Juicestate != null)
                {
                    if (Juicestate.Length > 0)
                    {
                        var Juicestate1 = Convert.ToString(Juicestate[0], 2);
                        var Juicestate2 = Juicestate[1];
                        if (Juicestate1.IndexOf("0") == 1 && Juicestate2 == 0)
                        {
                            morkTJakaJC.MakeJuiceEnd = true;
                        }
                    }
                }
                //若无状态返回 则加延迟
                if (!bFirstTrig_Juice)
                {
                    bFirstTrig_Juice = true;
                    delayTimeOut_Juice = DateTime.Now;
                }
                else if (DateTime.Now.Subtract(delayTimeOut_Juice).TotalSeconds > 30 && bFirstTrig_Juice == true)
                {
                    bFirstTrig_Juice = false;
                    morkTJakaJC.MakeJuiceEnd = true;
                }
            }
            if (morkTJakaJC.IsHaveTeaWaterCup)
            {
                if (!bFirstTrig_TeaWater)
                {
                    bFirstTrig_TeaWater = true;
                    delayTimeOut = DateTime.Now;
                }
                else if (DateTime.Now.Subtract(delayTimeOut).TotalSeconds >= 50 && bFirstTrig_TeaWater == true)
                {
                    bFirstTrig_TeaWater = false;
                    morkTJakaJC.MakeTeaEnd = true;
                }
            }
            DoCoffee();
            DoJuice();
            DoBoiledTea();
            DoBoiledWater();
        }
        /// <summary>
        /// 验证当前是做咖啡还是做冰淇淋
        /// </summary>
        /// <param name="batchingLoc">物料位置</param>
        private GOODS_TYPE ValidateGoodsByBatching(string batchingLoc)
        {
            if (batchings.ContainsKey(batchingLoc))
                return batchings[batchingLoc].GoodsType;
            return GOODS_TYPE.NEITHER;
        }
            
        private AutoResetEvent are = new AutoResetEvent(false);

        private T GetStatus<T>(string key)
        {
            if (peripheralStatus.ContainsKey(key))
            {
                if (peripheralStatus[key] != null)
                {
                    return (T)(peripheralStatus[key]);
                }
            }
            return default;
        }

        private void Wait(int value)
        {
            while (!((GetStatus<int>("Get_RobotAO1") == value) && GetStatus<int>("GetProgramStatus") == 0))//判断文件是否已经执行结束 且 文件末端变量值==文件名
            {
                Thread.Sleep(5);
            }
        }
        int[] devStatusBy = new int[2] { 0, 0 };
        private bool IsMakeCoffee()
        {
            bool bMake = (IsHealth && morkTJakaJC.morkOrderPushesCoffee.Count > 0 && !morkTJakaJC.IsHaveCoffeeCup) ? true : false;
            return bMake;
        }
        private bool IsMakeJuice()
        {
            bool bMake = (IsHealth && morkTJakaJC.morkOrderPushesJuicer.Count > 0 && !morkTJakaJC.IsHaveJuiceCup) ? true : false;
            return bMake;
        }
        private bool IsMakeTeaWater()
        {
            bool bMake = (IsHealth && morkTJakaJC.morkOrderPushesTea.Count > 0 && !morkTJakaJC.IsHaveTeaWaterCup) ? true : false;
            return bMake;
        }
        private bool IsMakeWater()
        {
            bool bMake = (IsHealth && morkTJakaJC.morkOrderPushesWater.Count > 0 && !morkTJakaJC.IsHaveTeaWaterCup) ? true : false;
            return bMake;
        }
        /// <summary>
        /// 传感器的输入信号 0:无意义 1：有信号 2：无信号 3：信号不正确
        /// </summary>
        int bSensorInput;
        /// <summary>
        /// 延迟的超时时间
        /// </summary>
        DateTime delayTimeOut;
        /// <summary>
        /// 做咖啡
        /// </summary>
        private void DoCoffee()
        {
            if (IsMakeCoffee())
            {
                if (morkTJakaJC.morkOrderPushesCoffee.TryDequeue(out OrderLocInfo orderLoc))
                {
                    PickUpCoffee();//接咖啡
                    morkTJakaJC.IsHaveCoffeeCup = true;
                }
            }
            else if (morkTJakaJC.MakeCoffeeEnd)
            {
                PutCoffeeCup();
                pickUpCoffeeHaveCup = false;
                morkTJakaJC.IsHaveCoffeeCup = false;
            }
        }
        private void DoJuice()
        {
            if (IsMakeJuice())
            {
                if (morkTJakaJC.morkOrderPushesJuicer.TryDequeue(out OrderLocInfo orderLoc))
                {
                    PickUpJuicer();
                    morkTJakaJC.IsHaveJuiceCup = true;
                }
            }
            else if (morkTJakaJC.MakeJuiceEnd)
            {
                Thread.Sleep(5000);//延迟五秒，防止接饮料口滴饮料
                putJuice();
                pickUpJuiceHaveCup = false;
                morkTJakaJC.IsHaveJuiceCup = false;
                morkTJakaJC.MakeJuiceEnd = false;
            }
        }
        private void DoBoiledTea()
        {
            if (IsMakeTeaWater())
            {
                if (morkTJakaJC.morkOrderPushesTea.TryDequeue(out OrderLocInfo orderLoc))
                {
                    PickUpTea();
                    morkTJakaJC.IsHaveTeaWaterCup = true;
                }
            }
            else if (morkTJakaJC.MakeTeaEnd)
            {
                PutWaterCup();
                pickUpHotWaterHaveCup = false;
                morkTJakaJC.IsHaveTeaWaterCup = false;
                morkTJakaJC.MakeTeaEnd = false;
            }
        }
        private void DoBoiledWater()
        {
            if (IsMakeWater())
            {
                if (morkTJakaJC.morkOrderPushesWater.TryDequeue(out OrderLocInfo orderLoc))
                {
                    PickUpWater();
                }
            }
            else if (morkTJakaJC.MakeTeaEnd)
            {
                PutWaterCup();
                pickUpHotWaterHaveCup = false;
                morkTJakaJC.IsHaveTeaWaterCup = false;
                morkTJakaJC.MakeTeaEnd = false;
            }
        }
        private void PickUpCoffee()
        {
            if (!pickUpCoffeeHaveCup)
            {
                OrderChange(morkTJakaJC.morkOrderPushesCoffee.ElementAt(0).SuborderId, BPA.Message.Enum.ORDER_STATUS.COOKING);
                int resultTakeCup = takeCup();
                if (resultTakeCup == 1)
                {
                    DeviceProcessLogShow("咖啡杯取杯完成");
                    new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_接咖啡 }.Publish();
                    Wait(int.Parse(JakaModel.SENCE_接咖啡));

                    new DRCoffee_MakeCoffeeEvent() { DeviceId = DeviceId, DrinkCode = (DrCoffeeDrinksCode)int.Parse(mainMaterialLoc) }.Publish();  //接咖啡控制 //DrCoffeeDrinksCode.热水
                    are.WaitOne(1000 * 180);
                }
                else
                {
                    new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_初始位 }.Publish();
                    Wait(int.Parse(JakaModel.SENCE_初始位));
                }
            }
        }
        private void PutCoffeeCup()
        {
            new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_放咖啡杯 }.Publish();
            Wait(int.Parse(JakaModel.SENCE_放咖啡杯));
            int resultputCup = putCup();
            if (resultputCup == 1)
            {
                //订单状态改变：完成
                new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_初始位 }.Publish();
                Wait(int.Parse(JakaModel.SENCE_初始位));
                OrderChange(morkTJakaJC.morkOrderPushesCoffee.ElementAt(0).SuborderId, BPA.Message.Enum.ORDER_STATUS.COMPLETED_TAKE);
            }
            else
            {
                new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_初始位 }.Publish();
                Wait(int.Parse(JakaModel.SENCE_初始位));
            }
        }
        /// <summary>
        /// 接开水
        /// </summary>
        private void PickUpWater()
        {
            #region 接水流程
            if (!pickUpHotWaterHaveCup)
            {
                OrderChange(morkTJakaJC.morkOrderPushesWater.ElementAt(0).SuborderId, BPA.Message.Enum.ORDER_STATUS.COOKING);
                int resultTakeCup = takeCup();
                if (resultTakeCup == 1)
                {
                    new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_接水 }.Publish();
                    Wait(int.Parse(JakaModel.SENCE_接水));

                    new WriteMcu() { TagName = "OutputControl", Value = false, Address = "4" }.Publish();


                    new WriteMcu() { TagName = "OutputControl", Value = false, Address = "3" }.Publish();
                    Thread.Sleep(100);
                    new WriteMcu() { TagName = "OutputControl", Value = true, Address = "3" }.Publish();
                    Thread.Sleep(3000);
                    new WriteMcu() { TagName = "OutputControl", Value = false, Address = "3" }.Publish();
                    Thread.Sleep(100);

                    new WriteMcu() { TagName = "OutputControl", Value = false, Address = "4" }.Publish();
                    Thread.Sleep(100);
                    new WriteMcu() { TagName = "OutputControl", Value = true, Address = "4" }.Publish();
                    Thread.Sleep(500);
                    new WriteMcu() { TagName = "OutputControl", Value = false, Address = "4" }.Publish();
                }
                else if (resultTakeCup == 2 || resultTakeCup == 3)
                {
                    new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_初始位 }.Publish();
                    Wait(int.Parse(JakaModel.SENCE_初始位));
                }
            }
            #endregion
        }
        /// <summary>
        /// 放水杯
        /// </summary>
        private void PutWaterCup()
        {
            new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_放茶水杯 }.Publish();
            Wait(int.Parse(JakaModel.SENCE_放茶水杯));
            int resultputCup = putCup();
            if (resultputCup == 1)
            {
                //订单状态改变：完成
                new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_初始位 }.Publish();
                Wait(int.Parse(JakaModel.SENCE_初始位));
                OrderChange(morkTJakaJC.morkOrderPushesCoffee.ElementAt(0).SuborderId, BPA.Message.Enum.ORDER_STATUS.COMPLETED_TAKE);
            }
            else
            {
                new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_初始位 }.Publish();
                Wait(int.Parse(JakaModel.SENCE_初始位));
            }
        }
        /// <summary>
        /// 做茶
        /// </summary>
        private void PickUpTea()
        {
            #region 接茶流程
            if (!pickUpHotWaterHaveCup)
            {
                OrderChange(morkTJakaJC.morkOrderPushesTea.ElementAt(0).SuborderId, BPA.Message.Enum.ORDER_STATUS.COOKING);
                int resultTakeCup = takeCup();
                if (resultTakeCup == 1)
                {
                    DeviceProcessLogShow("取茶杯完成");
                    new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_接茶 }.Publish();
                    Wait(int.Parse(JakaModel.SENCE_接茶));

                    new WriteMcu() { TagName = "ServoControl", Address = "1", Value = 105 }.Publish();
                    Thread.Sleep(1000);
                    new WriteMcu() { TagName = "ServoControl", Address = "1", Value = 130 }.Publish();
                    Thread.Sleep(1000);
                    new WriteMcu() { TagName = "ServoControl", Address = "1", Value = 105 }.Publish();

                    Thread.Sleep(3000);
                    new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_接茶_接水 }.Publish();
                    Wait(int.Parse(JakaModel.SENCE_接茶_接水));


                    new WriteMcu() { TagName = "OutputControl", Value = false, Address = "4" }.Publish();
                    new WriteMcu() { TagName = "OutputControl", Value = false, Address = "3" }.Publish();

                    Thread.Sleep(100);
                    new WriteMcu() { TagName = "OutputControl", Value = true, Address = "3" }.Publish();
                    Thread.Sleep(3000);
                    new WriteMcu() { TagName = "OutputControl", Value = false, Address = "3" }.Publish();
                    Thread.Sleep(100);

                    new WriteMcu() { TagName = "OutputControl", Value = false, Address = "4" }.Publish();
                    Thread.Sleep(100);
                    new WriteMcu() { TagName = "OutputControl", Value = true, Address = "4" }.Publish();
                    Thread.Sleep(500);
                    new WriteMcu() { TagName = "OutputControl", Value = false, Address = "4" }.Publish();
                }
                else if (resultTakeCup == 2 || resultTakeCup == 3)
                {
                    new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_初始位 }.Publish();
                    Wait(int.Parse(JakaModel.SENCE_初始位));
                }
            }
            #endregion
        }
        /// <summary>
        /// 果汁机控制信号
        /// </summary>
        private byte JuicerNum;
        private int JuiceCH;
        private void PickUpJuicer()
        {
            #region 接果汁流程
            if (!pickUpJuiceHaveCup)
            {
                OrderChange(morkTJakaJC.morkOrderPushesWater.ElementAt(0).SuborderId, BPA.Message.Enum.ORDER_STATUS.COOKING);
                int resultTakeCup = takeCup();
                JuiceCH = int.Parse(mainMaterialLoc);
                if (resultTakeCup == 1)
                {
                    switch (JuiceCH)
                    {
                        case 52:
                            if (GuMake)
                            {
                                JuicerNum = 0x00;
                            }
                            else
                            {
                                JuicerNum = 0x01;
                            }
                            new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_接果汁1 }.Publish();
                            Wait(int.Parse(JakaModel.SENCE_接果汁1));
                            break;
                        case 53:
                            if (GuMake)
                            {
                                JuicerNum = 0x02;
                            }
                            else
                            {
                                JuicerNum = 0x03;
                            }
                            new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_接果汁2 }.Publish();
                            Wait(int.Parse(JakaModel.SENCE_接果汁2));
                            break;
                        case 54:
                            if (GuMake)
                            {
                                JuicerNum = 0x04;
                            }
                            else
                            {
                                JuicerNum = 0x05;
                            }
                            new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_接果汁3 }.Publish();
                            Wait(int.Parse(JakaModel.SENCE_接果汁3));
                            break;
                        case 55:
                            if (GuMake)
                            {
                                JuicerNum = 0x06;
                            }
                            else
                            {
                                JuicerNum = 0x07;
                            }
                            new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_接果汁4 }.Publish();
                            Wait(int.Parse(JakaModel.SENCE_接果汁4));
                            break;
                        default:
                            JuicerNum = 0x00;
                            new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_接果汁1 }.Publish();
                            Wait(int.Parse(JakaModel.SENCE_接果汁1));
                            break;
                    }
                    new WriteJuicer() { Value = JuicerNum }.Publish();
                    pickUpJuiceHaveCup = true;
                }
                else
                {
                    return;
                }
            }
            #endregion
        }
        private void putJuice()
        {
            switch (JuiceCH)
            {
                case 52:
                    new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_放果汁杯1 }.Publish();
                    Wait(int.Parse(JakaModel.SENCE_放果汁杯1));
                    break;
                case 53:
                    new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_放果汁杯2 }.Publish();
                    Wait(int.Parse(JakaModel.SENCE_放果汁杯2));
                    break;
                case 54:
                    new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_放果汁杯3 }.Publish();
                    Wait(int.Parse(JakaModel.SENCE_放果汁杯3));
                    break;
                case 55:
                    new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_放果汁杯4 }.Publish();
                    Wait(int.Parse(JakaModel.SENCE_放果汁杯4));
                    break;
                default:
                    new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_放果汁杯1 }.Publish();
                    Wait(int.Parse(JakaModel.SENCE_放果汁杯1));
                    break;
            }
            int resultputCup = putCup();
            if (resultputCup == 1)
            {
                new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_初始位 }.Publish();
                Wait(int.Parse(JakaModel.SENCE_初始位));
                OrderChange(morkTJakaJC.morkOrderPushesWater.ElementAt(0).SuborderId, BPA.Message.Enum.ORDER_STATUS.COMPLETED_TAKE);
            }
            else
            {
                new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_初始位 }.Publish();
                Wait(int.Parse(JakaModel.SENCE_初始位));
            }
        }
        private int getCup_cnt;
        /// <summary>
        /// 取杯流程
        /// </summary>
        /// <returns>0:无意义，1：取杯成功 2：机构有杯子，取杯失败 3：机构没有杯子</returns>
        private int takeCup()
        {
            #region 单片机控制的IO
            //try
            //{
            //    getCup_cnt = 0;//取杯次数复位
            //    new WriteJaka() { TagName = "Set_RobotAO1", Value = 0 }.Publish();
            //    Wait(0);
            //    new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_初始位 }.Publish();
            //    Wait(int.Parse(JakaModel.SENCE_初始位));
            //    new WriteMcu() { TagName = "OutputControl", Address = "1", Value = true }.Publish();
            //    Thread.Sleep(10);
            //    new WriteMcu() { TagName = "OutputControl", Address = "1", Value = true }.Publish();
            //    new WriteJaka() { TagName = "Set_RobotAO1", Value = 0 }.Publish();
            //    Wait(0);
            //    new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_取杯 }.Publish();
            //    Wait(int.Parse(JakaModel.SENCE_取杯));
            //    bSensorInput = sensor_Sign(1);
            //    if (bSensorInput == 2)
            //    {
            //        Thread.Sleep(100);
            //        new WriteMcu() { TagName = "OutputControl", Address = "1", Value = false }.Publish();
            //        new WriteMcu() { TagName = "OutputControl", Address = "1", Value = false }.Publish();
            //        Thread.Sleep(100);
            //        new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_取杯检测 }.Publish();
            //        Wait(int.Parse(JakaModel.SENCE_取杯检测));
            //        DeviceProcessLogShow("落杯器没有纸杯了");
            //        return 3;
            //    }
            //    if (bSensorInput == 1)
            //    {
            //        Thread.Sleep(100);
            //        new WriteMcu() { TagName = "OutputControl", Address = "1", Value = false }.Publish();
            //        new WriteMcu() { TagName = "OutputControl", Address = "1", Value = false }.Publish();
            //        Thread.Sleep(100);
            //        new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_取杯检测 }.Publish();
            //        Wait(int.Parse(JakaModel.SENCE_取杯检测));
            //        bSensorInput = sensor_Sign(1);
            //        while (getCup_cnt < 4 && (bSensorInput == 2 || bSensorInput == 3))
            //        {
            //            DeviceProcessLogShow($"第{getCup_cnt}次取杯失败");
            //            Thread.Sleep(100);
            //            new WriteMcu() { TagName = "OutputControl", Address = "1", Value = true }.Publish();
            //            new WriteMcu() { TagName = "OutputControl", Address = "1", Value = true }.Publish();
            //            Thread.Sleep(100);
            //            new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_取杯 }.Publish();
            //            Wait(int.Parse(JakaModel.SENCE_取杯));
            //            getCup_cnt = getCup_cnt + 1;
            //            Thread.Sleep(100);
            //            new WriteMcu() { TagName = "OutputControl", Address = "1", Value = false }.Publish();
            //            new WriteMcu() { TagName = "OutputControl", Address = "1", Value = false }.Publish();
            //            Thread.Sleep(100);
            //            new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_取杯检测 }.Publish();
            //            Wait(int.Parse(JakaModel.SENCE_取杯检测));
            //            bSensorInput = sensor_Sign(1);
            //        }
            //        if (bSensorInput == 1)
            //        {
            //            return 1;
            //        }
            //        else
            //        {
            //            return 2;
            //        }
            //    }
            //    return 1;
            //}
            //catch (Exception ex)
            //{
            //    MessageLog.GetInstance.ShowEx(ex.ToString());
            //    return 0;
            //}
            #endregion
            try
            {
                getCup_cnt = 0;//取杯次数复位
                new WriteJaka() { TagName = "Set_RobotAO1", Value = 0 }.Publish();
                Wait(0);
                new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_初始位 }.Publish();
                Wait(int.Parse(JakaModel.SENCE_初始位));
                new WriteJaka() { TagName = "JakaDOutput", DO_Index=0, Value = true }.Publish();
                Thread.Sleep(100);
                new WriteJaka() { TagName = "Set_RobotAO1", Value = 0 }.Publish();
                Wait(0);
                new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_取杯 }.Publish();
                Wait(int.Parse(JakaModel.SENCE_取杯));
                //取杯到位，使用落杯器
                new WriteJaka() { TagName = "JakaDOutput", DO_Index = 1, Value = true }.Publish();
                if (sensor_Sign(1)==1 ) 
                {
                    new WriteJaka() { TagName = "JakaDOutput", DO_Index = 1, Value = false }.Publish();
                    Thread.Sleep(2000);
                    bSensorInput = sensor_Sign(0);
                    if (bSensorInput == 2)
                    {
                        Thread.Sleep(100);
                        new WriteJaka() { TagName = "JakaDOutput", DO_Index = 0, Value = false }.Publish();
                        Thread.Sleep(100);
                        new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_取杯检测 }.Publish();
                        Wait(int.Parse(JakaModel.SENCE_取杯检测));
                        DeviceProcessLogShow("落杯器没有纸杯了");
                        return 3;
                    }
                    if (bSensorInput == 1)
                    {
                        Thread.Sleep(100);
                        new WriteJaka() { TagName = "JakaDOutput", DO_Index = 0, Value = false }.Publish();
                        Thread.Sleep(100);
                        new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_取杯检测 }.Publish();
                        Wait(int.Parse(JakaModel.SENCE_取杯检测));
                        bSensorInput = sensor_Sign(1);
                        while (getCup_cnt < 4 && (bSensorInput == 2 || bSensorInput == 3))
                        {
                            DeviceProcessLogShow($"第{getCup_cnt}次取杯失败");
                            Thread.Sleep(100);
                            new WriteJaka() { TagName = "JakaDOutput", DO_Index = 0, Value = true }.Publish();
                            Thread.Sleep(100);
                            new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_取杯 }.Publish();
                            Wait(int.Parse(JakaModel.SENCE_取杯));
                            getCup_cnt = getCup_cnt + 1;
                            Thread.Sleep(100);
                            new WriteJaka() { TagName = "JakaDOutput", DO_Index = 0, Value = false }.Publish();
                            Thread.Sleep(100);
                            new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_取杯检测 }.Publish();
                            Wait(int.Parse(JakaModel.SENCE_取杯检测));
                            bSensorInput = sensor_Sign(1);
                        }
                        if (bSensorInput == 1)
                        {
                            return 1;
                        }
                        else
                        {
                            return 2;
                        }
                    }
                }
                
                return 1;
            }
            catch (Exception ex)
            {
                MessageLog.GetInstance.ShowEx(ex.ToString());
                return 0;
            }
        }
        /// <summary>
        /// 放杯
        /// </summary>
        /// <returns>0:无意义 1：执行成功 2：执行失败(传感器还有信号)</returns>
        private int putCup()
        {
            try
            {
                while (checkCup() == 2)
                {
                    Thread.Sleep(100);
                }
                new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_放杯 }.Publish();
                Wait(int.Parse(JakaModel.SENCE_放杯));
                Thread.Sleep(10);
                new WriteJaka() { TagName = "JakaDOutput", DO_Index = 0, Value = true }.Publish();
                Thread.Sleep(10);
                new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_放杯检测 }.Publish();
                Wait(int.Parse(JakaModel.SENCE_放杯检测));
                bSensorInput = sensor_Sign(3);
                delayTimeOut = DateTime.Now;
                while (bSensorInput == 2)
                {
                    Thread.Sleep(100);
                    bSensorInput = sensor_Sign(3);
                    if (DateTime.Now.Subtract(delayTimeOut).TotalSeconds >= 2) return 2;
                }
                if (bSensorInput == 2)
                {
                    DeviceProcessLogShow("放杯失败传感器没有信号");
                    new WriteJaka() { TagName = "JaKaProgramName", Value = JakaModel.SENCE_初始位 }.Publish();
                    Wait(int.Parse(JakaModel.SENCE_初始位));
                    return 1;
                }
                return 1;
            }
            catch (Exception ex)
            {
                MessageLog.GetInstance.ShowEx(ex.ToString());
                return 0;
            }
        }
        private int cnt_Check;
        /// <summary>
        /// 检测放杯位，是否有杯子
        /// </summary>
        /// <returns>0：无意义 1：没有杯子  2：有杯子 </returns>
        private int checkCup()
        {
            try
            {
                bSensorInput = sensor_Sign(2);
                if (bSensorInput == 2)
                {
                    DeviceProcessLogShow($"放杯位传感器没有信号:{cnt_Check}");
                    return 1;
                }
                else if (bSensorInput == 1)
                {
                    DeviceProcessLogShow($"放杯位传感器有信号:{cnt_Check}");
                    return 2;
                }
                return 2;
            }
            catch (Exception ex)
            {
                MessageLog.GetInstance.ShowEx(ex.ToString());
                return 0;
            }
        }

        private T McuRead<T>(string tagName, object par)
        {
            new ReadMcu() { DeviceId = DeviceId, TagName = tagName, ReadPar = par };
            if (peripheralStatus.ContainsKey(tagName))
            {
                if (peripheralStatus[tagName] != null)
                {
                    return (T)peripheralStatus[tagName];
                }
            }
            return default;
        }



        /// <summary>
        /// 传感器防抖0.2s内检测20次，
        /// </summary>
        /// <param name="num"></param>
        /// <returns></returns>
        private int sensor_Sign(byte num)
        {
            DeviceProcessLogShow($"开始检测{num}号传感器信号");
            int cnt = 0;
            cnt_Check = 0;
            while (true)
            {
                Thread.Sleep(10);
                if (num == 0)
                {
                    bSensorInput = GetStatus<bool>("Get_RobotDI0") ? 1 : 2;
                } 
                else if (num == 1) 
                {
                    bSensorInput = GetStatus<bool>("Get_RobotDI1") ? 1 : 2;
                }
                else if (num == 2)
                {
                    bSensorInput = GetStatus<bool>("Get_RobotDI2") ? 1 : 2;
                }
                else if (num == 3)
                {
                    bSensorInput = GetStatus<bool>("Get_RobotDI3") ? 1 : 2;
                }
                if (bSensorInput == 1)
                {
                    cnt_Check = cnt_Check + 1;
                    cnt = cnt + 1;
                }
                else if (bSensorInput == 2)
                {
                    cnt_Check = cnt_Check - 1;
                    cnt = cnt + 1;
                }
                if (cnt >= 20)
                {
                    break;
                }
            }
            if (cnt_Check >= 0)
            {
                DeviceProcessLogShow($"{num}传感器有信号:{cnt_Check}");
                return 1;
            }
            else
            {
                DeviceProcessLogShow($"{num}传感器没有信号:{cnt_Check}");
                return 2;
            }
        }
        private void DRCoffee_CoffeEndCookEventHandle(IEvent @event, EventCallBackHandle callBack)
        {
            are.Set();
        }

        public void SimOrder<T>(T simOrder)
        {
           
        }

        
       
        public override void Stop()
        {

        }

        public override void ReadData()
        {
            
        }


        public override void ResetProgram()
        {

        }

        public override void SimOrder()
        {
        }
    }
}
