using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Threading; using BPA.Message; using BPA.Utility; using HBLConsole.Communication; using HBLConsole.Factory; using HBLConsole.GVL; using HBLConsole.Interface; using HBLConsole.Model; using HBLConsole.Service; using HBLDevice.Coffee; using HBLDevice.IceCream; using Robotc; namespace HBLConsole.MORKIC { /* * 冰淇淋咖啡机组合套装 * 物料位置: * 1:冰淇料 * 2:冰淇淋杯 * 5:咖啡 * 6:咖啡杯 */ public class Control_MORKIC : IControl { GVL_MORIC mORKD = new GVL_MORIC(); //咖啡机主控程序 private CoffeeMachine coffeeMachine; //冰淇淋主控程序 private IceCreamMachine iceCreamMachine; //物料存放位置 private Dictionary batchings = new Dictionary(); //容器位置 private string holderLoc; //主料位置 private string mainMaterialLoc; //子订单ID private string subOrderId; /// /// 获取乐百机器人的数据 /// SignalResult lebai; public void ConnectOk() { } public object GetT() { return mORKD; } public void Init() { //构建所有商品物料信息 batchings = PolymerBatching.BuildAll(); EventBus.GetInstance().Subscribe(IceCreamEndCookHandle); EventBus.GetInstance().Subscribe(CoffeEndCookHandle); Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None); //一系列外围基础配置 var com_Coffee = config.AppSettings.Settings["COM_Coffee"].Value; var baud_Coffee = config.AppSettings.Settings["BAUD_Coffee"].Value; var com_IceCream = config.AppSettings.Settings["COM_IceCream"].Value; var baud_IceCream = config.AppSettings.Settings["BAUD_IceCream"].Value; var iceCreamCXBThreshold = int.Parse(config.AppSettings.Settings["IceCream_CXB_Threshold"].Value); if (iceCreamCXBThreshold > 0) { //设置冰淇淋成型比 MorkIStatus.GetInstance().CXB_Threshold = (byte)iceCreamCXBThreshold; } //咖啡机创建 coffeeMachine = new CoffeeMachine(com_Coffee, (BaudRates)Enum.Parse(typeof(BaudRates), baud_Coffee)); //冰淇淋机创建 iceCreamMachine = new IceCreamMachine(com_IceCream, (BaudRates)Enum.Parse(typeof(BaudRates), baud_IceCream)); Main(); ReadData(); } public void DataParse(T order) { //商品类型 GOODS_TYPE currentGoodsType = GOODS_TYPE.NEITHER; if (order is MorkOrderPush morkOrderPush) { //子订单ID subOrderId = morkOrderPush.SuborderId; //遍历物料 foreach (var item in morkOrderPush.GoodBatchings) { var res = Json.Data.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: DoCoffee(); break; case GOODS_TYPE.ICECREAM: DoIceCream(); break; } } /// /// 验证当前是做咖啡还是做冰淇淋 /// /// 物料位置 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 void DoCoffee() { //订单状态改变:开始制作 SimpleFactory.GetInstance.OrderChanged(subOrderId, BPA.Message.Enum.ORDER_STATUS.COOKING); //todo:先调用机器人 LebaiHelper.GetInstance.Scene(10002); new MakeCoffeeEvent() { DrinkCode = (DrCoffeeDrinksCode)int.Parse(mainMaterialLoc) }.Publish(); are.WaitOne(100 * 90); //订单状态改变:完成 SimpleFactory.GetInstance.OrderChanged(subOrderId, BPA.Message.Enum.ORDER_STATUS.COMPLETED_COOK); } /// /// 做冰淇淋 /// private void DoIceCream() { //订单状态改变:开始制作 SimpleFactory.GetInstance.OrderChanged(subOrderId, BPA.Message.Enum.ORDER_STATUS.COOKING); //todo:先调用机器人 LebaiHelper.GetInstance.Scene(10001); new DischargeEvent().Publish(); //冰淇淋没有模式切换,强制等待10s Thread.Sleep(10000); //are.WaitOne(100 * 90); //订单状态改变:完成 SimpleFactory.GetInstance.OrderChanged(subOrderId, BPA.Message.Enum.ORDER_STATUS.COMPLETED_COOK); } private void CoffeEndCookHandle(IEvent @event, EventBus.EventCallBackHandle callBack) { are.Set(); } private void IceCreamEndCookHandle(IEvent @event, EventBus.EventCallBackHandle callBack) { are.Set(); } public void Main() { //咖啡机开启主线程 coffeeMachine.Start(); //冰淇淋机开启主线程 iceCreamMachine.Start(); //开始心跳刷新,根据咖啡机及冰淇淋机来判断 ThreadOperate.GetInstance.StartLong(new Action(() => { GeneralConfig.Healthy = MorkIStatus.GetInstance().CanDo && MorkCStatus.GetInstance().CanDo; Thread.Sleep(100); }), "MORK-IC心跳刷新"); } public void ReadData() { ThreadOperate.GetInstance.StartLong(new Action(() => { lebai = LebaiHelper.GetInstance.GetValueAsync(); Thread.Sleep(100); }), "乐百机器人数据读取"); } public void SimOrder(T simOrder) { } } }