diff --git a/BPASmartClient.DRCoffee/BPASmartClient.DRCoffee.csproj b/BPASmartClient.DRCoffee/BPASmartClient.DRCoffee.csproj index 58a6fd19..7024144c 100644 --- a/BPASmartClient.DRCoffee/BPASmartClient.DRCoffee.csproj +++ b/BPASmartClient.DRCoffee/BPASmartClient.DRCoffee.csproj @@ -5,7 +5,6 @@ - diff --git a/BPASmartClient.DRCoffee/CoffeeMachine.cs b/BPASmartClient.DRCoffee/CoffeeMachine.cs index 541856ab..db8e06cc 100644 --- a/BPASmartClient.DRCoffee/CoffeeMachine.cs +++ b/BPASmartClient.DRCoffee/CoffeeMachine.cs @@ -3,6 +3,7 @@ using BPASmartClient.EventBus; using BPASmartClient.Helper; using BPASmartClient.Message; using BPASmartClient.Model; +using BPASmartClient.Model.咖啡机.Enum; using BPASmartClient.Peripheral; using BPASmartClient.SerialPort; using System; @@ -15,78 +16,33 @@ namespace BPASmartClient.DRCoffee /// /// 咖啡机 /// - public class CoffeeMachine: BasePeripheral + public class CoffeeMachine :BasePeripheral { //通讯代理 SerialPortClient commProxy = null; //数据仓库 private DataStorage dataStorage = new DataStorage(); - //主线程运行标识 - private bool running = false; //是否下发指令,主线程等待 - private bool free = true; - - private DrCoffeeStatus drCoffeeStatus; - /// - /// 咖啡机状态 - /// - public DrCoffeeStatus CurrentCoffeeStatus - { - get { return drCoffeeStatus; } - set - { - if (drCoffeeStatus != value) - { - drCoffeeStatus = value; - CoffeeStatusChanged?.Invoke(value); - } - } - } - private DrCoffeeAppStatus coffeeAppStatus; - /// - /// 应用状态 - /// - public DrCoffeeAppStatus CurrentCoffeeAppStatus - { - get { return coffeeAppStatus; } - set - { - if (coffeeAppStatus != value) - { - coffeeAppStatus = value; - CoffeeAppStatusChanged?.Invoke(value); - } - } - } - - public Action SendCallback; - public Action ReciveCallback; - - /// - /// 咖啡机状态改变回调 - /// - public Action CoffeeStatusChanged; - /// - /// 应用状态改变回调 - /// - public Action CoffeeAppStatusChanged; - /// - /// Dr咖啡机基础协议 - /// + private bool free = false; + //状态询问指令 + private byte[] cmdAsk; + //Dr咖啡机基础协议 private DrCoffeePackage drinksOrder = new DrCoffeePackage(); - - /// - /// 串口COM口 - /// + //串口COM口 public string PortName { get; set; } + //串口波特率 + public string BaudRate { get; set; } + //心跳时间 + private DateTime lastRefreshTime = DateTime.MinValue; /// - /// 串口波特率 + /// 是否在线 /// - public string BaudRate { get; set; } - + public bool OnLine { get { return DateTime.Now.Subtract(lastRefreshTime).TotalSeconds <= 3; } } public CoffeeMachine() { - + DrCoffeePackage package = new DrCoffeePackage(); + package.CommCmd = DrCoffeeCommCmd.饮品制作指令; + cmdAsk = DrCoffee.Packe(package); } /// @@ -94,10 +50,17 @@ namespace BPASmartClient.DRCoffee /// public override void Start() { - - commProxy.Start(); - running = true; - MainLoop(); + try + { + commProxy.Start(); + IsConnected = true; + free = false; + MainLoop(); + } + catch (Exception ex) + { + MessageLog.GetInstance.Show($"BPASmartClient.DRCoffee 中引发错误,CoffeeMachine 类,描述:[{ex.Message}]"); + } } /// @@ -105,8 +68,16 @@ namespace BPASmartClient.DRCoffee /// public override void Stop() { - commProxy.Stop(); - running = false; + try + { + commProxy.Stop(); + IsConnected = false; + free = true; + } + catch (Exception ex) + { + MessageLog.GetInstance.Show($"BPASmartClient.DRCoffee 中引发错误,CoffeeMachine 类,描述:[{ex.Message}]"); + } } /// @@ -114,15 +85,14 @@ namespace BPASmartClient.DRCoffee /// private void MainLoop() { - //ThreadManage.GetInstance.StartLong(new Action(() => - //{ - // if (free) - // { - // commProxy.SendData(commandHandler.GetStatusAsk()); - // SendCallback?.Invoke(BitConverter.ToString(commandHandler.GetStatusAsk())); - // } - // Thread.Sleep(200); - //}),"咖啡机询问线程"); + ThreadManage.GetInstance.StartLong(new Action(() => + { + if (!free) + { + commProxy.SendData(cmdAsk); + } + Thread.Sleep(200); + }),"咖啡机询问线程"); ThreadManage.GetInstance.StartLong(new Action(() => { @@ -137,9 +107,8 @@ namespace BPASmartClient.DRCoffee { temp.Add(item); var package = DrCoffee.UnPack(temp.ToArray()); - ReciveCallback?.Invoke(BitConverter.ToString(temp.ToArray())); temp.Clear(); - MorkCStatus.GetInstance().ProcessPackage(package); + ProcessPackage(package); } else { @@ -159,14 +128,45 @@ namespace BPASmartClient.DRCoffee } } Thread.Sleep(5); - }), "咖啡机解析线程"); + }),"咖啡机解析线程"); } - protected override void InitStatus() + /// + /// 咖啡机状态解析 + /// + /// + public void ProcessPackage(DrCoffeePackage package) { - + if (((DrCoffeeStatus)status["CoffeeStatus"]) == DrCoffeeStatus.Running && package.Status != DrCoffeeStatus.Running) + { + status["CoffeeStatus"] = package.Status; + lastRefreshTime = DateTime.Now; + new DRCoffee_CoffeEndCookEvent() { Id = DeviceId }.Publish(); + } + else status["CoffeeStatus"] = package.Status; + status["AppStatus"] = package.ApplicationStatus; + status["Warning"] = package.Warning; + status["Fault"] = package.Fault; + + if ((DrCoffeeStatus)status["CoffeeStatus"] == DrCoffeeStatus.Warning + || (DrCoffeeStatus)status["CoffeeStatus"] == DrCoffeeStatus.Fault + || (DrCoffeeWarning)status["Warning"] != DrCoffeeWarning.无警告 + || (DrCoffeeFault)status["Fault"] != DrCoffeeFault.无故障 + ) + { + IsWork = false; + } + else + IsWork = true; } + protected override void InitStatus() + { + status["CoffeeStatus"] = DrCoffeeStatus.Wait; + status["AppStatus"] = DrCoffeeAppStatus.应用无状态; + status["Warning"] = DrCoffeeWarning.无警告; + status["Fault"] = DrCoffeeFault.无故障; + } public override void Init() { @@ -181,7 +181,7 @@ namespace BPASmartClient.DRCoffee free = true; Thread.Sleep(200); drinksOrder.CommCmd = DrCoffeeCommCmd.饮品制作指令; - //drinksOrder.DrinksCode = ((DRCoffee_MakeCoffeeEvent)@event).CommCmd; + drinksOrder.DrinksCode = ((DRCoffee_MakeCoffeeEvent)@event).DrinkCode; commProxy.SendData(DrCoffee.Packe(drinksOrder)); Thread.Sleep(200); free = false; @@ -218,7 +218,7 @@ namespace BPASmartClient.DRCoffee { free = true; Thread.Sleep(200); - //drinksOrder.CommCmd = (DrCoffeeCommCmd)int.Parse(e.obj_MessageObj.ToString()); + drinksOrder.CommCmd = ((DRCoffee_CoffeeCommCmdEvent)@event).CommCmd; commProxy.SendData(DrCoffee.Packe(drinksOrder)); Thread.Sleep(200); free = false; @@ -229,5 +229,6 @@ namespace BPASmartClient.DRCoffee } }); } + } } diff --git a/BPASmartClient.DRCoffee/MorkCStatus.cs b/BPASmartClient.DRCoffee/MorkCStatus.cs deleted file mode 100644 index 226aa9e7..00000000 --- a/BPASmartClient.DRCoffee/MorkCStatus.cs +++ /dev/null @@ -1,76 +0,0 @@ -using BPASmartClient.DRCoffee; -using BPASmartClient.MessageCommunication; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace BPASmartClient.DRCoffee -{ - public class MorkCStatus - { - private volatile static MorkCStatus _Instance; - public static MorkCStatus GetInstance() => _Instance ?? (_Instance = new MorkCStatus()); - private MorkCStatus() { } - - private DateTime lastRefreshTime = DateTime.MinValue; - /// - /// 是否在线 - /// - public bool OnLine { get { return DateTime.Now.Subtract(lastRefreshTime).TotalSeconds <= 3; } } - /// - /// 咖啡机状态 - /// - public DrCoffeeStatus CoffeeStatus { get; set; } - /// - /// 应用状态 - /// - public DrCoffeeAppStatus AppStatus { get; set; } - /// - /// 警告信息 - /// - public DrCoffeeWarning Warning { get; set; } - /// - /// 故障信息 - /// - public DrCoffeeFault Fault { get; set; } - - public bool CanDo - { - get - - { - if (!OnLine) - return false; - if (Warning != DrCoffeeWarning.无警告) - return false; - if (Fault != DrCoffeeFault.无故障) - return false; - return true; - } - } - - /// - /// 咖啡机状态解析 - /// - /// - public void ProcessPackage(DrCoffeePackage package) - { - if (CoffeeStatus == DrCoffeeStatus.Running && package.Status != DrCoffeeStatus.Running) - { - CoffeeStatus = package.Status; - Class_InnerMessageBus.GetInstance().PostMessage(this,Class_MessageName.DRCoffee_CoffeEndCook,""); - } - else { - CoffeeStatus = package.Status; - } - - AppStatus = package.ApplicationStatus; - Warning = package.Warning; - Fault = package.Fault; - - lastRefreshTime = DateTime.Now; - } - } -} diff --git a/BPASmartClient.DRCoffee/Protocal/DrCoffeePackage.cs b/BPASmartClient.DRCoffee/Protocal/DrCoffeePackage.cs index f1aafa02..563affe6 100644 --- a/BPASmartClient.DRCoffee/Protocal/DrCoffeePackage.cs +++ b/BPASmartClient.DRCoffee/Protocal/DrCoffeePackage.cs @@ -1,4 +1,5 @@ -using System; +using BPASmartClient.Model.咖啡机.Enum; +using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; diff --git a/BPASmartClient.GSIceCream/BPASmartClient.GSIceCream.csproj b/BPASmartClient.GSIceCream/BPASmartClient.GSIceCream.csproj index 9fe941ae..8289875b 100644 --- a/BPASmartClient.GSIceCream/BPASmartClient.GSIceCream.csproj +++ b/BPASmartClient.GSIceCream/BPASmartClient.GSIceCream.csproj @@ -5,7 +5,8 @@ - + + diff --git a/BPASmartClient.GSIceCream/CommandHandler.cs b/BPASmartClient.GSIceCream/CommandHandler.cs deleted file mode 100644 index c4b8ad81..00000000 --- a/BPASmartClient.GSIceCream/CommandHandler.cs +++ /dev/null @@ -1,134 +0,0 @@ -using BPASmartClient.Message; -using BPASmartClient.MessageCommunication; -using BPASmartClient.MessageCommunication.MsgControl; -using BPASmartClient.SerialPort; -using System; -using System.Threading; - -namespace BPASmartClient.GSIceCream -{ - /// - /// 指令封装 - /// - internal class CommandHandler - { - byte[] cmdHeartDW; - - private SerialPortClient commProxy; - public Action PauseAsk { get; set; } - - /// - /// 初始化 - /// - internal void Init(SerialPortClient commProxy) - { - this.commProxy = commProxy; - ICMSG_Heart_DW heartDW = new ICMSG_Heart_DW(); - cmdHeartDW = IcPack.StructureToByte(heartDW); - Class_InnerMessageBus.GetInstance().ListenMessage(this,Class_MessageName.GSIceCream_ModeSet,"ModeSetHandler"); - Class_InnerMessageBus.GetInstance().ListenMessage(this,Class_MessageName.GSIceCream_Discharge,"DischargeHandler"); - } - - /// - /// 发送心跳 - /// - internal byte[] GetHeartDW() - { - return cmdHeartDW; - } - /// - /// 模式设置 - /// - public void ModeSetHandler(object sender,InnerMessageEventArgs e) - { - try - { - if (e.obj_MessageObj is MORKI_MODE) - { - PauseAsk?.Invoke(true); - Thread.Sleep(200); - var data = IcPack.StructureToByte(ICMSG_MODE_DW.Build((MORKI_MODE)(e.obj_MessageObj))); - commProxy.SendData(data); - Thread.Sleep(200); - PauseAsk?.Invoke(false); - MessageLog.GetInstance.Show(string.Format("设置模式[{0}]",Enum.GetName(typeof(MORKI_MODE),(MORKI_MODE)e.obj_MessageObj))); - } - } - catch (Exception ex) - { - MessageLog.GetInstance.Show($"BPASmartClient.GSIceCream 中引发错误,ModeSetHandler 类,描述:[{ex.Message}]"); - } - } - - /// - /// 打料 - /// - public void DischargeHandler(object sender,InnerMessageEventArgs e) - { - try - { - if (e.obj_MessageObj is MORKI_MODE) - { - if (MorkIStatus.GetInstance().Fault != MORKI_FAULT.未发生故障) - { - MessageLog.GetInstance.Show(string.Format("当前存在故障[{0}%],不允许制作",MorkIStatus.GetInstance().Fault)); - //callBack?.Invoke(false); - return; - } - if (MorkIStatus.GetInstance().CXB <= 86) - { - MessageLog.GetInstance.Show(string.Format("当前成型比[{0}%],低于86%,不允许制作",MorkIStatus.GetInstance().CXB)); - //callBack?.Invoke(false); - return; - } - - bool modeRight = MorkIStatus.GetInstance().CurrentMode == MORKI_MODE.制冷模式; - - if (!modeRight) - { - PauseAsk?.Invoke(true); - Thread.Sleep(200); - - var temp = IcPack.StructureToByte(ICMSG_MODE_DW.Build(MORKI_MODE.制冷模式)); - commProxy.SendData(temp); - - Thread.Sleep(200); - PauseAsk?.Invoke(false); - MessageLog.GetInstance.Show(string.Format("出料操作->设置模式[{0}]",MORKI_MODE.制冷模式)); - - DateTime freeTime = DateTime.Now.AddSeconds(5); - while (DateTime.Now < freeTime) - { - Thread.Sleep(10); - modeRight = MorkIStatus.GetInstance().CurrentMode == MORKI_MODE.制冷模式; - if (modeRight) - break; - } - } - - if (modeRight) - { - PauseAsk?.Invoke(true); - Thread.Sleep(200); - var data = IcPack.StructureToByte(ICMSG_MODE_DW.Build(MORKI_MODE.打料)); - commProxy.SendData(data); - Thread.Sleep(200); - PauseAsk?.Invoke(false); - Class_InnerMessageBus.GetInstance().PostMessage(this,Class_MessageName.GSIceCream_EndCook,""); - MessageLog.GetInstance.Show(string.Format("出料操作->设置模式[{0}]",MORKI_MODE.打料)); - //callBack?.Invoke(true); - } - else - { - MessageLog.GetInstance.Show(string.Format("出料操作->模式切换失败,当前模式[{0}],不允许出料",MorkIStatus.GetInstance().CurrentMode)); - //callBack?.Invoke(false); - } - } - } - catch (Exception ex) - { - MessageLog.GetInstance.Show($"BPASmartClient.GSIceCream 中引发错误,ModeSetHandler 类,描述:[{ex.Message}]"); - } - } - } -} diff --git a/BPASmartClient.GSIceCream/IceCreamMachine.cs b/BPASmartClient.GSIceCream/IceCreamMachine.cs index dab7e5dc..79a66028 100644 --- a/BPASmartClient.GSIceCream/IceCreamMachine.cs +++ b/BPASmartClient.GSIceCream/IceCreamMachine.cs @@ -1,47 +1,77 @@ -using BPASmartClient.Helper; +using BPASmartClient.EventBus; +using BPASmartClient.Helper; +using BPASmartClient.Message; +using BPASmartClient.Model; +using BPASmartClient.Model.冰淇淋.Enum; +using BPASmartClient.Peripheral; using BPASmartClient.SerialPort; using System; using System.Collections.Generic; +using System.Linq; using System.Threading; +using static BPASmartClient.EventBus.EventBus; using static BPASmartClient.GSIceCream.MessageDefine; namespace BPASmartClient.GSIceCream { - public class IceCreamMachine - { - //指令组装 - private CommandHandler commandHandler = new CommandHandler(); + public class IceCreamMachine :BasePeripheral + { //通讯代理 SerialPortClient commProxy = null; + //是否下发指令,主线程等待 + private bool free = false; + //心跳指令 + private byte[] cmdHeartDW; //数据仓库 private DataStorage dataStorage = new DataStorage(); - //主线程运行标识 - private bool running = false; - //是否下发指令,主线程等待 - private bool free = true; - public Action SendCallback; - public Action ReciveCallback; + //串口COM口 + public string PortName { get; set; } + //串口波特率 + public string BaudRate { get; set; } + //心跳时间 + private DateTime lastRefreshTime = DateTime.MinValue; + //是否在线 + public bool OnLine { get { return DateTime.Now.Subtract(lastRefreshTime).TotalSeconds <= 3; } } - public IceCreamMachine(string portName, BaudRates baud) + public IceCreamMachine() { - commProxy = new SerialPortClient(portName, baud); - commProxy.SetDataStorage(dataStorage); - commandHandler.Init(commProxy); - commandHandler.PauseAsk = delegate (bool pause) - { - free = !pause; - }; + ICMSG_Heart_DW heartDW = new ICMSG_Heart_DW(); + cmdHeartDW = IcPack.StructureToByte(heartDW); } - public void Start() + /// + /// 主线程开始运行 + /// + public override void Start() { - commProxy.Start(); - running = true; - MainLoop(); + try + { + commProxy.Start(); + IsConnected = true; + free = false; + MainLoop(); + } + catch (Exception ex) + { + MessageLog.GetInstance.Show($"BPASmartClient.GSIceCream 中引发错误,IceCreamMachine 类,描述:[{ex.Message}]"); + } } - public void Stop() + /// + /// 停止运行 + /// + public override void Stop() { + try + { + commProxy.Stop(); + IsConnected = false; + free = true; + } + catch (Exception ex) + { + MessageLog.GetInstance.Show($"BPASmartClient.GSIceCream 中引发错误,IceCreamMachine 类,描述:[{ex.Message}]"); + } } private MSG_RESOLVE_STEP currentStep; @@ -49,10 +79,9 @@ namespace BPASmartClient.GSIceCream { ThreadManage.GetInstance.StartLong(new Action(() => { - if (free) + if (!free) { - commProxy.SendData(commandHandler.GetHeartDW()); - SendCallback?.Invoke(BitConverter.ToString(commandHandler.GetHeartDW())); + commProxy.SendData(cmdHeartDW); } Thread.Sleep(500); }), "冰淇淋询问线程"); @@ -60,16 +89,12 @@ namespace BPASmartClient.GSIceCream ThreadManage.GetInstance.StartLong(new Action(() => { ResolveMsg(); - //Thread.Sleep(2000); }), "冰淇淋解析线程"); } int contentLength = 0; int currentContentOffset = 0; private void ResolveMsg() { - - //while (running) - //{ List temp = new List(); //一系列解包 while (dataStorage.GetSize() > 0) @@ -142,13 +167,168 @@ namespace BPASmartClient.GSIceCream } temp.Add(dataStorage.GetData()); temp.Add(dataStorage.GetData()); - ReciveCallback?.Invoke(BitConverter.ToString(temp.ToArray())); - MorkIStatus.GetInstance().ProcessMsg(temp.ToArray()); + ProcessMsg(temp.ToArray()); currentStep = MSG_RESOLVE_STEP.NONE; continue; } Thread.Sleep(5); - //} + } + + private void ProcessHeart(ICMSG_Heart_UP heartUpMsg) + { + status["CurrentMode"] = heartUpMsg.MS; + status["YLWD"] = BitConverter.ToInt16(new byte[] { heartUpMsg.YLWD_L,heartUpMsg.YLWD_H },0); + status["HQWD"] = BitConverter.ToInt16(new byte[] { heartUpMsg.HQWD_L,heartUpMsg.HQWD_H },0); + status["HJWD"] = BitConverter.ToInt16(new byte[] { heartUpMsg.HJWD_L,heartUpMsg.HJWD_H },0); + status["DL"] = BitConverter.ToInt16(new byte[] { heartUpMsg.DL_L,heartUpMsg.DL_H },0); + status["Fault"] = (MORKI_FAULT)BitConverter.ToInt16(new byte[] { heartUpMsg.GZ_L,heartUpMsg.GZ_H },0); + status["CXB"] = heartUpMsg.CXB; + status["DLCompleted"] = (heartUpMsg.DLTJ >> 4 & 1) == 1; + + if (RTrig.GetInstance("打料完成检测").Start((bool)status["DLCompleted"])) + { + MessageLog.GetInstance.Show("打料完成"); + } + + if (RTrig.GetInstance("打料中检测").Start(!(bool)status["DLCompleted"])) + { + MessageLog.GetInstance.Show("打料中"); + } + } + + private void ProcessModeUp(ICMSG_MODE_UP modeUpMsg) + { + MessageLog.GetInstance.Show(string.Format("模式返回为:{0}",modeUpMsg.Mode)); + } + + public void ProcessMsg(byte[] data) + { + lastRefreshTime = DateTime.Now; + try + { + if (data.Length < 5) + return; + switch (data[2]) + { + case (byte)IC_CMD.HEART: + var msg = IcPack.ByteToStructure(data.ToArray()); + ProcessHeart(msg); + break; + case (byte)IC_CMD.MODE: + var modeUp = IcPack.ByteToStructure(data.ToArray()); + ProcessModeUp(modeUp); + break; + } + } + catch (Exception ex) + { + + } + } + + protected override void InitStatus() + { + status["YLWD"] = (short)0; + status["HQWD"] = (short)0; + status["HJWD"] = (short)0; + status["DL"] = (short)0; + status["DY"] = (short)0; + status["CurrentMode"] = MORKI_MODE.待机模式; + status["Fault"] = MORKI_FAULT.未发生故障; + status["CXB"] = (byte)0; + status["CXB_Threshold"] = (byte)0; + status["DLCompleted"] = true; + } + + public override void Init() + { + commProxy = new SerialPortClient(PortName,(BaudRates)Enum.Parse(typeof(BaudRates),BaudRate)); + commProxy.SetDataStorage(dataStorage); + + + //广深冰淇淋机模式设置 + EventBus.EventBus.GetInstance().Subscribe(DeviceId,delegate (IEvent @event,EventCallBackHandle callBack) + { + try + { + free = true; + Thread.Sleep(200); + var data = IcPack.StructureToByte(ICMSG_MODE_DW.Build(((GSIceCream_ModeSetEvent)@event).Mode)); + commProxy.SendData(data); + Thread.Sleep(200); + free = false; + MessageLog.GetInstance.Show(string.Format("设置模式[{0}]",Enum.GetName(typeof(MORKI_MODE),((GSIceCream_ModeSetEvent)@event).Mode))); + } + catch (Exception ex) + { + MessageLog.GetInstance.Show($"BPASmartClient.GSIceCream 中引发错误,IceCreamMachine 类,描述:[{ex.Message}]"); + } + }); + + //广深冰淇淋机打料 + EventBus.EventBus.GetInstance().Subscribe(DeviceId,delegate (IEvent @event,EventCallBackHandle callBack) + { + try + { + if ((MORKI_FAULT)status["Fault"] != MORKI_FAULT.未发生故障) + { + MessageLog.GetInstance.Show(string.Format("当前存在故障[{0}%],不允许制作",(MORKI_FAULT)status["Fault"])); + new GSIceCream_EndCookEvent() { Id = DeviceId,Status = false }.Publish(); + return; + } + if ((byte)status["CXB"] <= 86) + { + MessageLog.GetInstance.Show(string.Format("当前成型比[{0}%],低于86%,不允许制作",(byte)status["CXB"])); + new GSIceCream_EndCookEvent() { Id = DeviceId,Status = false }.Publish(); + return; + } + + bool modeRight = (MORKI_MODE)status["CurrentMode"] == MORKI_MODE.制冷模式; + + if (!modeRight) + { + free = true; + Thread.Sleep(200); + + var temp = IcPack.StructureToByte(ICMSG_MODE_DW.Build(MORKI_MODE.制冷模式)); + commProxy.SendData(temp); + + Thread.Sleep(200); + free = false; + MessageLog.GetInstance.Show(string.Format("出料操作->设置模式[{0}]",MORKI_MODE.制冷模式)); + + DateTime freeTime = DateTime.Now.AddSeconds(5); + while (DateTime.Now < freeTime) + { + Thread.Sleep(10); + modeRight = (MORKI_MODE)status["CurrentMode"] == MORKI_MODE.制冷模式; + if (modeRight) + break; + } + } + + if (modeRight) + { + free = true; + Thread.Sleep(200); + var data = IcPack.StructureToByte(ICMSG_MODE_DW.Build(MORKI_MODE.打料)); + commProxy.SendData(data); + Thread.Sleep(200); + free = false; + new GSIceCream_EndCookEvent() { Id = DeviceId,Status =true}.Publish(); + MessageLog.GetInstance.Show(string.Format("出料操作->设置模式[{0}]",MORKI_MODE.打料)); + } + else + { + MessageLog.GetInstance.Show(string.Format("出料操作->模式切换失败,当前模式[{0}],不允许出料",(MORKI_MODE)status["CurrentMode"])); + new GSIceCream_EndCookEvent() { Id = DeviceId,Status = false }.Publish(); + } + } + catch (Exception ex) + { + MessageLog.GetInstance.Show($"BPASmartClient.GSIceCream 中引发错误,IceCreamMachine 类,描述:[{ex.Message}]"); + } + }); } } diff --git a/BPASmartClient.GSIceCream/MorkIStatus.cs b/BPASmartClient.GSIceCream/MorkIStatus.cs deleted file mode 100644 index 0057533b..00000000 --- a/BPASmartClient.GSIceCream/MorkIStatus.cs +++ /dev/null @@ -1,130 +0,0 @@ -using BPASmartClient.Helper; -using BPASmartClient.Message; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static BPASmartClient.GSIceCream.MessageDefine; - -namespace BPASmartClient.GSIceCream -{ - public class MorkIStatus - { - private volatile static MorkIStatus _Instance; - public static MorkIStatus GetInstance() => _Instance ?? (_Instance = new MorkIStatus()); - private MorkIStatus() { } - private DateTime lastRefreshTime = DateTime.MinValue; - /// - /// 是否在线 - /// - public bool OnLine { get { return DateTime.Now.Subtract(lastRefreshTime).TotalSeconds <= 3; } } - /// - /// 预冷温度 - /// - public short YLWD { get; set; } - /// - /// 回气温度 - /// - public short HQWD { get; set; } - /// - /// 环境温度 - /// - public short HJWD { get; set; } - /// - /// 电流 - /// - public short DL { get; set; } - /// - /// 电压 - /// - public short DY { get; set; } - /// - /// 当前模式 - /// - public MORKI_MODE CurrentMode { get; set; } - /// - /// 故障 - /// - public MORKI_FAULT Fault { get; set; } - /// - /// 成型比 - /// - public byte CXB { get; set; } - /// - /// 成型比(门限) - /// - public byte CXB_Threshold { get; set; } - /// - /// 打料完成(完成为true,正在打料为false) - /// - public bool DLCompleted { get; set; } - - - public bool CanDo - { - get - { - if (!OnLine) - return false; - if (Fault != MORKI_FAULT.未发生故障) - return false; - if (CXB < CXB_Threshold) - return false; - return true; - } - } - - private void ProcessHeart(ICMSG_Heart_UP heartUpMsg) - { - CurrentMode = heartUpMsg.MS; - YLWD = BitConverter.ToInt16(new byte[] { heartUpMsg.YLWD_L, heartUpMsg.YLWD_H }, 0); - HQWD = BitConverter.ToInt16(new byte[] { heartUpMsg.HQWD_L, heartUpMsg.HQWD_H }, 0); - HJWD = BitConverter.ToInt16(new byte[] { heartUpMsg.HJWD_L, heartUpMsg.HJWD_H }, 0); - DL = BitConverter.ToInt16(new byte[] { heartUpMsg.DL_L, heartUpMsg.DL_H }, 0); - Fault = (MORKI_FAULT)BitConverter.ToInt16(new byte[] { heartUpMsg.GZ_L, heartUpMsg.GZ_H }, 0); - CXB = heartUpMsg.CXB; - DLCompleted = (heartUpMsg.DLTJ >> 4 & 1) == 1; - - if (RTrig.GetInstance("打料完成检测").Start(DLCompleted)) - { - MessageLog.GetInstance.Show("打料完成"); - } - - if(RTrig.GetInstance("打料中检测").Start(!DLCompleted)) - { - MessageLog.GetInstance.Show("打料中"); - } - } - - private void ProcessModeUp(ICMSG_MODE_UP modeUpMsg) - { - MessageLog.GetInstance.Show(string.Format("模式返回为:{0}", modeUpMsg.Mode)); - } - - public void ProcessMsg(byte[] data) - { - lastRefreshTime = DateTime.Now; - try - { - if (data.Length < 5) - return; - switch (data[2]) - { - case (byte)IC_CMD.HEART: - var msg = IcPack.ByteToStructure(data.ToArray()); - ProcessHeart(msg); - break; - case (byte)IC_CMD.MODE: - var modeUp = IcPack.ByteToStructure(data.ToArray()); - ProcessModeUp(modeUp); - break; - } - } - catch (Exception ex) - { - - } - } - } -} diff --git a/BPASmartClient.GSIceCream/Protocal/ICMSG_Heart_DW.cs b/BPASmartClient.GSIceCream/Protocal/ICMSG_Heart_DW.cs index e3bb0f30..a7973bb6 100644 --- a/BPASmartClient.GSIceCream/Protocal/ICMSG_Heart_DW.cs +++ b/BPASmartClient.GSIceCream/Protocal/ICMSG_Heart_DW.cs @@ -1,4 +1,5 @@ -using System; +using BPASmartClient.Model.冰淇淋.Enum; +using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; diff --git a/BPASmartClient.GSIceCream/Protocal/ICMSG_Heart_UP.cs b/BPASmartClient.GSIceCream/Protocal/ICMSG_Heart_UP.cs index 90a127fb..a2daf77e 100644 --- a/BPASmartClient.GSIceCream/Protocal/ICMSG_Heart_UP.cs +++ b/BPASmartClient.GSIceCream/Protocal/ICMSG_Heart_UP.cs @@ -1,4 +1,5 @@ -using System; +using BPASmartClient.Model.冰淇淋.Enum; +using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; diff --git a/BPASmartClient.GSIceCream/Protocal/ICMSG_MODE_DW.cs b/BPASmartClient.GSIceCream/Protocal/ICMSG_MODE_DW.cs index eb0fb4a4..fd34abfb 100644 --- a/BPASmartClient.GSIceCream/Protocal/ICMSG_MODE_DW.cs +++ b/BPASmartClient.GSIceCream/Protocal/ICMSG_MODE_DW.cs @@ -1,4 +1,5 @@ -using System; +using BPASmartClient.Model.冰淇淋.Enum; +using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; diff --git a/BPASmartClient.GSIceCream/Protocal/ICMSG_MODE_UP.cs b/BPASmartClient.GSIceCream/Protocal/ICMSG_MODE_UP.cs index 3f16a278..2a19b575 100644 --- a/BPASmartClient.GSIceCream/Protocal/ICMSG_MODE_UP.cs +++ b/BPASmartClient.GSIceCream/Protocal/ICMSG_MODE_UP.cs @@ -1,4 +1,5 @@ -using System.Runtime.InteropServices; +using BPASmartClient.Model.冰淇淋.Enum; +using System.Runtime.InteropServices; using static BPASmartClient.GSIceCream.MessageDefine; namespace BPASmartClient.GSIceCream diff --git a/BPASmartClient.KLMCoffee/BPASmartClient.KLMCoffee.csproj b/BPASmartClient.KLMCoffee/BPASmartClient.KLMCoffee.csproj index 9fe941ae..8289875b 100644 --- a/BPASmartClient.KLMCoffee/BPASmartClient.KLMCoffee.csproj +++ b/BPASmartClient.KLMCoffee/BPASmartClient.KLMCoffee.csproj @@ -5,7 +5,8 @@ - + + diff --git a/BPASmartClient.KLMCoffee/CoffeeMachine.cs b/BPASmartClient.KLMCoffee/CoffeeMachine.cs new file mode 100644 index 00000000..4742fc4d --- /dev/null +++ b/BPASmartClient.KLMCoffee/CoffeeMachine.cs @@ -0,0 +1,36 @@ +using BPASmartClient.Helper; +using BPASmartClient.SerialPort; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BPASmartClient.KLMCoffee +{ + public class CoffeeMachine + { + //通讯代理 + SerialPortClient commProxy = null; + //数据仓库 + private DataStorage dataStorage = new DataStorage(); + //是否下发指令,主线程等待 + private bool free = false; + //状态询问指令 + private byte[] cmdAsk; + //串口COM口 + public string PortName { get; set; } + //串口波特率 + public string BaudRate { get; set; } + //心跳时间 + private DateTime lastRefreshTime = DateTime.MinValue; + //是否在线 + public bool OnLine { get { return DateTime.Now.Subtract(lastRefreshTime).TotalSeconds <= 3; } } + public CoffeeMachine() + { + + } + + + } +} diff --git a/BPASmartClient.KLMCoffee/CommandEvent.cs b/BPASmartClient.KLMCoffee/CommandEvent.cs deleted file mode 100644 index e96c5a29..00000000 --- a/BPASmartClient.KLMCoffee/CommandEvent.cs +++ /dev/null @@ -1,44 +0,0 @@ -using BPASmartClient.KLMCoffee.Protocal; - -namespace BPASmartClient.KLMCoffee -{ - /// - /// 制作咖啡 - /// - public class MakeCoffeeEvent - { - public DrinkType DrinkCode { get; set; } - } - - /// - /// 取消制作 - /// - public class CancelMakeCoffeeEvent - { - - } - - /// - /// 模式设置 - /// - public class CoffeeCommCmdEvent - { - //public DrCoffeeCommCmd CommCmd { get; set; } - } - - /// - /// 开始制作 - /// - public class CoffeBeginCook - { - - } - - /// - /// 结束制作 - /// - public class CoffeEndCook - { - - } -} diff --git a/BPASmartClient.KLMCoffee/CommandHandler.cs b/BPASmartClient.KLMCoffee/CommandHandler.cs deleted file mode 100644 index 23b23675..00000000 --- a/BPASmartClient.KLMCoffee/CommandHandler.cs +++ /dev/null @@ -1,111 +0,0 @@ -using BPASmartClient.KLMCoffee.Protocal; -using BPASmartClient.MessageCommunication; -using BPASmartClient.MessageCommunication.MsgControl; -using BPASmartClient.SerialPort; -using System; -using System.Threading; - -namespace BPASmartClient.KLMCoffee -{ - /// - /// 指令封装 - /// - internal class CommandHandler - { - byte[] cmdAsk; - private SerialPortClient commProxy; - private K95Command drinksOrder = new K95Command(); - public Action PauseAsk { get; set; } - - /// - /// 初始化 - /// - internal void Init(SerialPortClient commProxy) - { - this.commProxy = commProxy; - Class_InnerMessageBus.GetInstance().ListenMessage(this,Class_MessageName.KLMCoffee_MakeCoffee,"MakeCoffeeHandler"); - Class_InnerMessageBus.GetInstance().ListenMessage(this,Class_MessageName.KLMCoffee_CancelMakeCoffee,"CancelMakeCoffeeHandler"); - Class_InnerMessageBus.GetInstance().ListenMessage(this,Class_MessageName.KLMCoffee_CoffeeCommCmd,"CoffeeCommCmdHandler"); - } - - ///// - ///// 制作咖啡 - ///// - //public void MakeCoffeeHandler(object sender,InnerMessageEventArgs e) - //{ - // try - // { - // if (e.obj_MessageObj is MakeCoffeeEvent) - // { - // PauseAsk?.Invoke(true); - // Thread.Sleep(200); - // drinksOrder.ReturnsCommandData(K95CommandEnum.配方咖啡制作.GetString(),new new RecipeModel().Packe - // ); - // drinksOrder.CommCmd = DrCoffeeCommCmd.饮品制作指令; - // drinksOrder.DrinksCode = (DrCoffeeDrinksCode)int.Parse(e.obj_MessageObj.ToString()); - // commProxy.SendData(DrCoffee.Packe(drinksOrder)); - // Thread.Sleep(200); - // PauseAsk?.Invoke(false); - // } - // } - // catch (Exception ex) - // { - // MessageLog.GetInstance.Show($"BPASmartClient.DRCoffee 中引发错误,CancelMakeCoffeeHandler 类,描述:[{ex.Message}]"); - // } - //} - - ///// - ///// 取消制作 - ///// - //public void CancelMakeCoffeeHandler(object sender,InnerMessageEventArgs e) - //{ - // try - // { - // PauseAsk?.Invoke(true); - // Thread.Sleep(200); - // drinksOrder.CommCmd = DrCoffeeCommCmd.取消应用指令; - // drinksOrder.DrinksCode = 0; - // commProxy.SendData(DrCoffee.Packe(drinksOrder)); - // Thread.Sleep(200); - // PauseAsk?.Invoke(false); - // } - // catch (Exception ex) - // { - // MessageLog.GetInstance.Show($"BPASmartClient.DRCoffee 中引发错误,CancelMakeCoffeeHandler 类,描述:[{ex.Message}]"); - // } - //} - - ///// - ///// 模式设置 - ///// - ///// - ///// - //public void CoffeeCommCmdHandler(object sender,InnerMessageEventArgs e) - //{ - // try - // { - // if (e.obj_MessageObj is string) - // { - // PauseAsk?.Invoke(true); - // Thread.Sleep(200); - // drinksOrder.CommCmd = (DrCoffeeCommCmd)int.Parse(e.obj_MessageObj.ToString()); - // commProxy.SendData(DrCoffee.Packe(drinksOrder)); - // Thread.Sleep(200); - // PauseAsk?.Invoke(false); - // } - // } - // catch (Exception ex) - // { - // MessageLog.GetInstance.Show($"BPASmartClient.DRCoffee 中引发错误,CoffeeCommCmdHandler 类,描述:[{ex.Message}]"); - // } - //} - - /// - /// 发送状态询问 - /// - internal byte[] GetStatusAsk() - { - return cmdAsk; - } - } -} diff --git a/BPASmartClient.KLMCoffee/Protocal/SystemStatusModel.cs b/BPASmartClient.KLMCoffee/Protocal/SystemStatusModel.cs index 7702e89f..49ff81bf 100644 --- a/BPASmartClient.KLMCoffee/Protocal/SystemStatusModel.cs +++ b/BPASmartClient.KLMCoffee/Protocal/SystemStatusModel.cs @@ -12,26 +12,32 @@ namespace BPASmartClient.KLMCoffee.Protocal /// 系统状态 /// public K95SysTemStatus temStatus { get; set; } + /// /// 饮品类型 /// public DrinkType drinkType { get; set; } + /// /// 制作状态 /// public MakeStatus makeStatus { get; set; } + /// /// 当前任务 /// public TaskIndex taskIndex { get; set; } + /// /// 当前进度 10% /// public int progress { get; set; } + /// /// 故障信息 /// public FaultMessage faultMessage { get; set; } + /// /// 保养信息 /// diff --git a/BPASmartClient.Model/BPASmartClient.Model.csproj b/BPASmartClient.Model/BPASmartClient.Model.csproj index 4de56856..df1a01f9 100644 --- a/BPASmartClient.Model/BPASmartClient.Model.csproj +++ b/BPASmartClient.Model/BPASmartClient.Model.csproj @@ -11,7 +11,7 @@ - + diff --git a/BPASmartClient.GSIceCream/Protocal/MORKI_MODE.cs b/BPASmartClient.Model/冰淇淋/Enum/MORKI_MODE.cs similarity index 95% rename from BPASmartClient.GSIceCream/Protocal/MORKI_MODE.cs rename to BPASmartClient.Model/冰淇淋/Enum/MORKI_MODE.cs index 85e40580..772556d8 100644 --- a/BPASmartClient.GSIceCream/Protocal/MORKI_MODE.cs +++ b/BPASmartClient.Model/冰淇淋/Enum/MORKI_MODE.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace BPASmartClient.GSIceCream +namespace BPASmartClient.Model.冰淇淋.Enum { /* * 模式 参数 diff --git a/BPASmartClient.Model/冰淇淋/GSIceCreamEvent.cs b/BPASmartClient.Model/冰淇淋/GSIceCreamEvent.cs index 447dea1d..ea9d0468 100644 --- a/BPASmartClient.Model/冰淇淋/GSIceCreamEvent.cs +++ b/BPASmartClient.Model/冰淇淋/GSIceCreamEvent.cs @@ -1,4 +1,5 @@ -using System; +using BPASmartClient.Model.冰淇淋.Enum; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -17,7 +18,7 @@ namespace BPASmartClient.Model /// public class GSIceCream_ModeSetEvent :BaseEvent { - + public MORKI_MODE Mode { get; set; } } /// @@ -33,6 +34,9 @@ namespace BPASmartClient.Model /// public class GSIceCream_EndCookEvent :BaseEvent { - + /// + /// 状态:true 成功 false 失败 + /// + public bool Status { get; set; } } } diff --git a/BPASmartClient.SCChip/Protocal/IC_CUP.cs b/BPASmartClient.Model/单片机/Enum/IC_CUP.cs similarity index 89% rename from BPASmartClient.SCChip/Protocal/IC_CUP.cs rename to BPASmartClient.Model/单片机/Enum/IC_CUP.cs index a85f0e58..695bb5e2 100644 --- a/BPASmartClient.SCChip/Protocal/IC_CUP.cs +++ b/BPASmartClient.Model/单片机/Enum/IC_CUP.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace BPASmartClient.SCChip +namespace BPASmartClient.Model.单片机.Enum { /// /// 杯子 diff --git a/BPASmartClient.SCChip/Protocal/IC_SE.cs b/BPASmartClient.Model/单片机/Enum/IC_SE.cs similarity index 91% rename from BPASmartClient.SCChip/Protocal/IC_SE.cs rename to BPASmartClient.Model/单片机/Enum/IC_SE.cs index 5d3e073a..a22bcb59 100644 --- a/BPASmartClient.SCChip/Protocal/IC_SE.cs +++ b/BPASmartClient.Model/单片机/Enum/IC_SE.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace BPASmartClient.SCChip +namespace BPASmartClient.Model.单片机.Enum { /// /// 冰淇淋舵机 diff --git a/BPASmartClient.Model/单片机/SCChipEvent.cs b/BPASmartClient.Model/单片机/SCChipEvent.cs index 6a76f911..a7e6f201 100644 --- a/BPASmartClient.Model/单片机/SCChipEvent.cs +++ b/BPASmartClient.Model/单片机/SCChipEvent.cs @@ -1,4 +1,5 @@ -using System; +using BPASmartClient.Model.单片机.Enum; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -17,7 +18,10 @@ namespace BPASmartClient.Model.单片机 /// public class SCChip_TakeCupEvent :BaseEvent { - + /// + /// 杯 + /// + public IC_CUP Cup { get; set; } } /// @@ -25,7 +29,7 @@ namespace BPASmartClient.Model.单片机 /// public class SCChip_MakeIceCreamEvent :BaseEvent { - + public IC_SE SteeringEngine { get; set; } } /// @@ -33,7 +37,8 @@ namespace BPASmartClient.Model.单片机 /// public class SCChip_SESwitchCreamEvent :BaseEvent { - + public IC_SE SteeringEngine { get; set; } + public bool IsOpen { get; set; } } /// @@ -41,6 +46,6 @@ namespace BPASmartClient.Model.单片机 /// public class SCChip_RotorSwitchEvent :BaseEvent { - + public bool TurnOn { get; set; } } } diff --git a/BPASmartClient.Model/咖啡机/DRCoffeeEvent.cs b/BPASmartClient.Model/咖啡机/DRCoffeeEvent.cs index 5d49b769..3df8ead2 100644 --- a/BPASmartClient.Model/咖啡机/DRCoffeeEvent.cs +++ b/BPASmartClient.Model/咖啡机/DRCoffeeEvent.cs @@ -1,4 +1,5 @@ -using System; +using BPASmartClient.Model.咖啡机.Enum; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -17,6 +18,7 @@ namespace BPASmartClient.Model /// public class DRCoffee_MakeCoffeeEvent :BaseEvent { + public DrCoffeeDrinksCode DrinkCode { get; set; } } /// @@ -32,7 +34,7 @@ namespace BPASmartClient.Model /// public class DRCoffee_CoffeeCommCmdEvent :BaseEvent { - + public DrCoffeeCommCmd CommCmd { get; set; } } /// diff --git a/BPASmartClient.DRCoffee/Protocal/DrCoffeeCommCmd.cs b/BPASmartClient.Model/咖啡机/Enum/DrCoffeeCommCmd.cs similarity index 93% rename from BPASmartClient.DRCoffee/Protocal/DrCoffeeCommCmd.cs rename to BPASmartClient.Model/咖啡机/Enum/DrCoffeeCommCmd.cs index d58adee2..bed221c0 100644 --- a/BPASmartClient.DRCoffee/Protocal/DrCoffeeCommCmd.cs +++ b/BPASmartClient.Model/咖啡机/Enum/DrCoffeeCommCmd.cs @@ -4,12 +4,12 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace BPASmartClient.DRCoffee +namespace BPASmartClient.Model.咖啡机.Enum { /// /// 通信指令 /// - public enum DrCoffeeCommCmd : byte + public enum DrCoffeeCommCmd :byte { 无指令 = 0x00, 饮品制作指令 = 0x01, diff --git a/BPASmartClient.DRCoffee/Protocal/DrCoffeeDrinksCode.cs b/BPASmartClient.Model/咖啡机/Enum/DrCoffeeDrinksCode.cs similarity index 91% rename from BPASmartClient.DRCoffee/Protocal/DrCoffeeDrinksCode.cs rename to BPASmartClient.Model/咖啡机/Enum/DrCoffeeDrinksCode.cs index fb7d67e7..a86926bc 100644 --- a/BPASmartClient.DRCoffee/Protocal/DrCoffeeDrinksCode.cs +++ b/BPASmartClient.Model/咖啡机/Enum/DrCoffeeDrinksCode.cs @@ -4,12 +4,12 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace BPASmartClient.DRCoffee +namespace BPASmartClient.Model.咖啡机.Enum { /// /// 饮品编号 /// - public enum DrCoffeeDrinksCode : byte + public enum DrCoffeeDrinksCode :byte { 意式浓缩 = 1, 美式咖啡 = 2, diff --git a/BPASmartClient.SCChip/BPASmartClient.SCChip.csproj b/BPASmartClient.SCChip/BPASmartClient.SCChip.csproj index 4bbee89a..7024144c 100644 --- a/BPASmartClient.SCChip/BPASmartClient.SCChip.csproj +++ b/BPASmartClient.SCChip/BPASmartClient.SCChip.csproj @@ -5,7 +5,7 @@ - + diff --git a/BPASmartClient.SCChip/ChipStatus.cs b/BPASmartClient.SCChip/ChipStatus.cs deleted file mode 100644 index 38f6a68f..00000000 --- a/BPASmartClient.SCChip/ChipStatus.cs +++ /dev/null @@ -1,128 +0,0 @@ -using System; - -namespace BPASmartClient.SCChip -{ - public class ChipStatus - { - private volatile static ChipStatus _Instance; - public static ChipStatus GetInstance() => _Instance ?? (_Instance = new ChipStatus()); - private ChipStatus() { } - - private DateTime lastRefreshTime = DateTime.MinValue; - /// - /// 是否在线 - /// - public bool OnLine { get { return DateTime.Now.Subtract(lastRefreshTime).TotalSeconds <= 3; } } - /// - /// 取冰淇淋杯完成 - /// - public bool CompletedTake_CPU_CUP_ICECREAM { get; set; } - /// - /// 取咖啡杯完成 - /// - public bool CompletedTake_CPU_CUP_COFFEE { get; set; } - /// - /// 1号舵机打开完成 - /// - public bool CompletedOpen_SE_1 { get; set; } - /// - /// 2号舵机打开完成 - /// - public bool CompletedOpen_SE_2 { get; set; } - /// - /// 3号舵机打开完成 - /// - public bool CompletedOpen_SE_3 { get; set; } - /// - /// 1号舵机关闭完成 - /// - public bool CompletedClose_SE_1 { get; set; } - /// - /// 2号舵机关闭完成 - /// - public bool CompletedClose_SE_2 { get; set; } - /// - /// 3号舵机关闭完成 - /// - public bool CompletedClose_SE_3 { get; set; } - /// - /// 是否存在物品 - /// - public bool ArticleExits { get; set; } - /// - /// 物品距离 - /// - public byte ArticleDist { get; set; } - - public bool CanDo - { - get - { - if (!OnLine) - return false; - return true; - } - } - - public void ProcessMsg(ICChipPackage data) - { - try - { - switch (data.Cmd) - { - case IC_CMD.HEART_BEAT: - lastRefreshTime = DateTime.Now; - break; - case IC_CMD.TAKE_CUP: - switch ((IC_CUP)data.Value) { - case IC_CUP.CUP_COFFEE: - CompletedTake_CPU_CUP_COFFEE = true; - break; - case IC_CUP.CUP_ICECREAM: - CompletedTake_CPU_CUP_ICECREAM = true; - break; - } - break; - case IC_CMD.OPEN_SE: - switch ((IC_SE)data.Value) - { - case IC_SE.SE_1: - CompletedOpen_SE_1 = true; - break; - case IC_SE.SE_2: - CompletedOpen_SE_2 = true; - break; - case IC_SE.SE_3: - CompletedOpen_SE_3 = true; - break; - } - break; - case IC_CMD.CLOSE_SE: - switch ((IC_SE)data.Value) - { - case IC_SE.SE_1: - CompletedClose_SE_1 = true; - break; - case IC_SE.SE_2: - CompletedClose_SE_2 = true; - break; - case IC_SE.SE_3: - CompletedClose_SE_3 = true; - break; - } - break; - case IC_CMD.ARTICLE_EXITS: - ArticleExits = data.Value > 0; - break; - case IC_CMD.ARTICLE_DIST: - ArticleDist = data.Value; - break; - } - } - catch (Exception ex) - { - - } - } - } -} diff --git a/BPASmartClient.SCChip/CommandEvent.cs b/BPASmartClient.SCChip/CommandEvent.cs deleted file mode 100644 index e7d500f8..00000000 --- a/BPASmartClient.SCChip/CommandEvent.cs +++ /dev/null @@ -1,42 +0,0 @@ -using BPASmartClient.SCChip; - -namespace BPASmartClient.SCChip -{ - public class TakeCupEvent - { - /// - /// 杯 - /// - public IC_CUP Cup { get; set; } - } - - public class MakeIceCreamEvent - { - public IC_SE SteeringEngine { get; set; } - } - - public class SESwitchCreamEvent - { - public IC_SE SteeringEngine { get; set; } - public bool IsOpen { get; set; } - } - - public class RotorSwitchEvent - { - public bool TurnOn { get; set; } - } - /// - /// 检测有无杯子 - /// - public class ArticleExitsEvent - { - - } - /// - /// 检测物品距离 - /// - public class ArticleDistEvent - { - - } -} diff --git a/BPASmartClient.SCChip/CommandHandler.cs b/BPASmartClient.SCChip/CommandHandler.cs deleted file mode 100644 index 157670ba..00000000 --- a/BPASmartClient.SCChip/CommandHandler.cs +++ /dev/null @@ -1,225 +0,0 @@ -using BPASmartClient.Message; -using BPASmartClient.MessageCommunication; -using BPASmartClient.MessageCommunication.MsgControl; -using BPASmartClient.SerialPort; -using System; -using System.Runtime.InteropServices; -using System.Threading; - -namespace BPASmartClient.SCChip -{ - /// - /// 指令封装 - /// - internal class CommandHandler - { - private SerialPortClient commProxy; - private ICChipPackage package = new ICChipPackage(); - - /// - /// 初始化 - /// - internal void Init(SerialPortClient commProxy) - { - this.commProxy = commProxy; - Class_InnerMessageBus.GetInstance().ListenMessage(this,Class_MessageName.SCChip_TakeCup,"TakeCupHandler"); - Class_InnerMessageBus.GetInstance().ListenMessage(this,Class_MessageName.SCChip_MakeIceCream,"MakeIceCreamHandler"); - Class_InnerMessageBus.GetInstance().ListenMessage(this,Class_MessageName.SCChip_SESwitchCream,"SESwitchCreamHandler"); - Class_InnerMessageBus.GetInstance().ListenMessage(this,Class_MessageName.SCChip_RotorSwitch,"RotorSwitchHandler"); - - } - - /// - /// STM32F103RCT6单片机舵机打开或者关闭 - /// - public void SESwitchCreamHandler(object sender,InnerMessageEventArgs e) - { - try - { - if (e.obj_MessageObj is TakeCupEvent) - { - ChipStatus.GetInstance().ArticleDist = 0; - package.Cmd = (e.obj_MessageObj as SESwitchCreamEvent).IsOpen ? IC_CMD.OPEN_SE : IC_CMD.CLOSE_SE; - package.Value = (byte)(e.obj_MessageObj as SESwitchCreamEvent).SteeringEngine; - commProxy.SendData(StructureToByte(package)); - } - } - catch (Exception ex) - { - MessageLog.GetInstance.Show($"BPASmartClient.SCChip 中引发错误,SESwitchCreamHandler 类,描述:[{ex.Message}]"); - } - } - - /// - /// STM32F103RCT6单片机控制冰淇淋机器转 - /// - public void RotorSwitchHandler(object sender,InnerMessageEventArgs e) - { - try - { - if (e.obj_MessageObj is RotorSwitchEvent) - { - package.Cmd = IC_CMD.ROTOR; - package.Value = (e.obj_MessageObj as RotorSwitchEvent).TurnOn ? (byte)IC_ROTOR.OPEN_ROTOR : (byte)IC_ROTOR.CLOSE_ROTOR; - commProxy.SendData(StructureToByte(package)); - } - } - catch (Exception ex) - { - MessageLog.GetInstance.Show($"BPASmartClient.SCChip 中引发错误,RotorSwitchHandler 类,描述:[{ex.Message}]"); - } - } - - /// - /// STM32F103RCT6单片机舵机打料 - /// - public void MakeIceCreamHandler(object sender,InnerMessageEventArgs e) - { - try - { - if (e.obj_MessageObj is MakeIceCreamEvent) - { - switch ((e.obj_MessageObj as MakeIceCreamEvent).SteeringEngine) - { - case IC_SE.SE_1: - ChipStatus.GetInstance().CompletedOpen_SE_1 = false; - break; - case IC_SE.SE_2: - ChipStatus.GetInstance().CompletedOpen_SE_2 = false; - break; - case IC_SE.SE_3: - ChipStatus.GetInstance().CompletedOpen_SE_3 = false; - break; - } - package.Cmd = IC_CMD.OPEN_SE; - package.Value = (byte)(e.obj_MessageObj as MakeIceCreamEvent).SteeringEngine; - commProxy.SendData(StructureToByte(package)); - - bool wait = true; - DateTime waitTimeout = DateTime.Now.AddSeconds(3); - while (wait) - { - wait = DateTime.Now < waitTimeout; - if (wait) - { - switch ((e.obj_MessageObj as MakeIceCreamEvent).SteeringEngine) - { - case IC_SE.SE_1: - wait = !ChipStatus.GetInstance().CompletedOpen_SE_1; - break; - case IC_SE.SE_2: - wait = !ChipStatus.GetInstance().CompletedOpen_SE_2; - break; - case IC_SE.SE_3: - wait = !ChipStatus.GetInstance().CompletedOpen_SE_3; - break; - } - } - Thread.Sleep(10); - } - Thread.Sleep(2000); - package.Cmd = IC_CMD.CLOSE_SE; - package.Value = (byte)(e.obj_MessageObj as MakeIceCreamEvent).SteeringEngine; - commProxy.SendData(StructureToByte(package)); - - wait = true; - waitTimeout = DateTime.Now.AddSeconds(3); - while (wait) - { - wait = DateTime.Now < waitTimeout; - if (wait) - { - switch ((e.obj_MessageObj as MakeIceCreamEvent).SteeringEngine) - { - case IC_SE.SE_1: - wait = !ChipStatus.GetInstance().CompletedClose_SE_1; - break; - case IC_SE.SE_2: - wait = !ChipStatus.GetInstance().CompletedClose_SE_2; - break; - case IC_SE.SE_3: - wait = !ChipStatus.GetInstance().CompletedClose_SE_3; - break; - } - } - Thread.Sleep(10); - } - } - } - catch (Exception ex) - { - MessageLog.GetInstance.Show($"BPASmartClient.SCChip 中引发错误,MakeIceCreamHandler 类,描述:[{ex.Message}]"); - } - } - - /// - /// STM32F103RCT6单片机下杯 - /// - public void TakeCupHandler(object sender,InnerMessageEventArgs e) - { - try - { - if (e.obj_MessageObj is TakeCupEvent) - { - switch ((e.obj_MessageObj as TakeCupEvent).Cup) - { - case IC_CUP.CUP_ICECREAM: - ChipStatus.GetInstance().CompletedTake_CPU_CUP_ICECREAM = false; - break; - case IC_CUP.CUP_COFFEE: - ChipStatus.GetInstance().CompletedTake_CPU_CUP_COFFEE = false; - break; - } - package.Cmd = IC_CMD.TAKE_CUP; - package.Value = (byte)(e.obj_MessageObj as TakeCupEvent).Cup; - commProxy.SendData(StructureToByte(package)); - - bool wait = true; - var waitTimeout = DateTime.Now.AddSeconds(3); - while (wait) - { - wait = DateTime.Now < waitTimeout; - if (wait) - { - switch ((e.obj_MessageObj as TakeCupEvent).Cup) - { - case IC_CUP.CUP_ICECREAM: - wait = !ChipStatus.GetInstance().CompletedTake_CPU_CUP_ICECREAM; - break; - case IC_CUP.CUP_COFFEE: - wait = !ChipStatus.GetInstance().CompletedTake_CPU_CUP_COFFEE; - break; - } - } - Thread.Sleep(10); - } - } - } - catch (Exception ex) - { - MessageLog.GetInstance.Show($"BPASmartClient.SCChip 中引发错误,TakeCupHandler 类,描述:[{ex.Message}]"); - } - } - - private byte[] StructureToByte(ICChipPackage structure) - { - structure.Header = 0xAA; - structure.Sender = IC_SENDER.CONSOLE; - structure.End = 0xBB; - - int size = Marshal.SizeOf(typeof(ICChipPackage)); - byte[] buffer = new byte[size]; - IntPtr bufferIntPtr = Marshal.AllocHGlobal(size); - try - { - Marshal.StructureToPtr(structure, bufferIntPtr, true); - Marshal.Copy(bufferIntPtr, buffer, 0, size); - } - finally - { - Marshal.FreeHGlobal(bufferIntPtr); - } - return buffer; - } - } -} diff --git a/BPASmartClient.SCChip/ICChipMachine.cs b/BPASmartClient.SCChip/ICChipMachine.cs index e5eda44b..4ef0958e 100644 --- a/BPASmartClient.SCChip/ICChipMachine.cs +++ b/BPASmartClient.SCChip/ICChipMachine.cs @@ -1,59 +1,86 @@ -using BPASmartClient.Helper; +using BPASmartClient.EventBus; +using BPASmartClient.Helper; +using BPASmartClient.Message; +using BPASmartClient.Model; +using BPASmartClient.Model.单片机; +using BPASmartClient.Model.单片机.Enum; using BPASmartClient.Peripheral; using BPASmartClient.SerialPort; using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Threading; +using static BPASmartClient.EventBus.EventBus; namespace BPASmartClient.SCChip { - public class ICChipMachine: BasePeripheral + public class ICChipMachine :BasePeripheral { - //指令组装 - private CommandHandler commandHandler = new CommandHandler(); //通讯代理 SerialPortClient commProxy = null; //数据仓库 private DataStorage dataStorage = new DataStorage(); - //主线程运行标识 - private bool running = false; - //是否下发指令,主线程等待 - public Action SendCallback; - public Action ReciveCallback; - - /// - /// 串口COM口 - /// + //单片机基础协议 + private ICChipPackage package = new ICChipPackage(); + //串口COM口 public string PortName { get; set; } + //串口波特率 + public string BaudRate { get; set; } + //心跳时间 + private DateTime lastRefreshTime = DateTime.MinValue; /// - /// 串口波特率 + /// 是否在线 /// - public string BaudRate { get; set; } + public bool OnLine { get { return DateTime.Now.Subtract(lastRefreshTime).TotalSeconds <= 3; } } public ICChipMachine() { - //commProxy = new SerialPortClient(portName, baud); - //commProxy.SetDataStorage(dataStorage); - //commandHandler.Init(commProxy); + } + /// + /// 主线程开始运行 + /// public override void Start() { - commProxy.Start(); - running = true; - MainLoop(); + try + { + commProxy.Start(); + IsConnected = true; + MainLoop(); + } + catch (Exception ex) + { + MessageLog.GetInstance.Show($"BPASmartClient.SCChip 中引发错误,ICChipMachine 类,描述:[{ex.Message}]"); + } + } - + /// + /// 停止运行 + /// + public override void Stop() + { + try + { + commProxy.Stop(); + IsConnected = false; + } + catch (Exception ex) + { + MessageLog.GetInstance.Show($"BPASmartClient.SCChip 中引发错误,ICChipMachine 类,描述:[{ex.Message}]"); + } + } + /// + /// 主循环,循环询问状态 + /// private void MainLoop() { ThreadManage.GetInstance.StartLong(new Action(() => { ResolveMsg(); - //Thread.Sleep(2000); - }), "单片机解析线程"); + }),"单片机解析线程"); } private void ResolveMsg() @@ -74,7 +101,7 @@ namespace BPASmartClient.SCChip if (temp[4] == 0xBB) { var package = ByteToStructure(temp.ToArray()); - ChipStatus.GetInstance().ProcessMsg(package); + ProcessMsg(package); } temp.Clear(); } @@ -93,8 +120,8 @@ namespace BPASmartClient.SCChip IntPtr allocIntPtr = Marshal.AllocHGlobal(size); try { - Marshal.Copy(dataBuffer, 0, allocIntPtr, size); - structure = (ICChipPackage)Marshal.PtrToStructure(allocIntPtr, typeof(ICChipPackage)); + Marshal.Copy(dataBuffer,0,allocIntPtr,size); + structure = (ICChipPackage)Marshal.PtrToStructure(allocIntPtr,typeof(ICChipPackage)); } finally { @@ -103,16 +130,254 @@ namespace BPASmartClient.SCChip return structure; } - protected override void InitStatus() + private byte[] StructureToByte(ICChipPackage structure) { + structure.Header = 0xAA; + structure.Sender = IC_SENDER.CONSOLE; + structure.End = 0xBB; + + int size = Marshal.SizeOf(typeof(ICChipPackage)); + byte[] buffer = new byte[size]; + IntPtr bufferIntPtr = Marshal.AllocHGlobal(size); + try + { + Marshal.StructureToPtr(structure,bufferIntPtr,true); + Marshal.Copy(bufferIntPtr,buffer,0,size); + } + finally + { + Marshal.FreeHGlobal(bufferIntPtr); + } + return buffer; } - public override void Stop() + public void ProcessMsg(ICChipPackage data) + { + try + { + switch (data.Cmd) + { + case IC_CMD.HEART_BEAT: + lastRefreshTime = DateTime.Now; + status["OnLine"] = OnLine; + break; + case IC_CMD.TAKE_CUP: + switch ((IC_CUP)data.Value) + { + case IC_CUP.CUP_COFFEE: + status["CompletedTake_CPU_CUP_COFFEE"] = true; + break; + case IC_CUP.CUP_ICECREAM: + status["CompletedTake_CPU_CUP_ICECREAM"] = true; + break; + } + break; + case IC_CMD.OPEN_SE: + switch ((IC_SE)data.Value) + { + case IC_SE.SE_1: + status["CompletedOpen_SE_1"] = true; + break; + case IC_SE.SE_2: + status["CompletedOpen_SE_2"] = true; + break; + case IC_SE.SE_3: + status["CompletedOpen_SE_3"] = true; + break; + } + break; + case IC_CMD.CLOSE_SE: + switch ((IC_SE)data.Value) + { + case IC_SE.SE_1: + status["CompletedClose_SE_1"] = true; + break; + case IC_SE.SE_2: + status["CompletedClose_SE_2"] = true; + break; + case IC_SE.SE_3: + status["CompletedClose_SE_3"] = true; + break; + } + break; + } + if(!OnLine) IsWork = false; + else IsWork = true; + } + catch (Exception ex) + { + + } + } + + protected override void InitStatus() { + status["CompletedTake_CPU_CUP_ICECREAM"] = false; + status["CompletedTake_CPU_CUP_COFFEE"] = false; + status["CompletedOpen_SE_1"] = false; + status["CompletedOpen_SE_2"] = false; + status["CompletedOpen_SE_3"] = false; + status["CompletedClose_SE_1"] = false; + status["CompletedClose_SE_2"] = false; + status["CompletedClose_SE_3"] = false; } public override void Init() { + commProxy = new SerialPortClient(PortName,(BaudRates)Enum.Parse(typeof(BaudRates),BaudRate)); + commProxy.SetDataStorage(dataStorage); + + //STM32F103RCT6单片机下杯 + EventBus.EventBus.GetInstance().Subscribe(DeviceId,delegate (IEvent @event,EventCallBackHandle callBack) + { + try + { + switch ((@event as SCChip_TakeCupEvent).Cup) + { + case IC_CUP.CUP_ICECREAM: + status["CompletedTake_CPU_CUP_ICECREAM"] = false; + break; + case IC_CUP.CUP_COFFEE: + status["CompletedTake_CPU_CUP_COFFEE"] = false; + break; + } + package.Cmd = IC_CMD.TAKE_CUP; + package.Value = (byte)(@event as SCChip_TakeCupEvent).Cup; + commProxy.SendData(StructureToByte(package)); + + bool wait = true; + var waitTimeout = DateTime.Now.AddSeconds(3); + while (wait) + { + wait = DateTime.Now < waitTimeout; + if (wait) + { + switch ((@event as SCChip_TakeCupEvent).Cup) + { + case IC_CUP.CUP_ICECREAM: + wait = !(bool)status["CompletedTake_CPU_CUP_ICECREAM"]; + break; + case IC_CUP.CUP_COFFEE: + wait = !(bool)status["CompletedTake_CPU_CUP_COFFEE"]; + break; + } + } + Thread.Sleep(10); + } + } + catch (Exception ex) + { + MessageLog.GetInstance.Show($"BPASmartClient.SCChip 中引发错误,ICChipMachine 类,描述:[{ex.Message}]"); + } + }); + + //STM32F103RCT6单片机舵机打料 + EventBus.EventBus.GetInstance().Subscribe(DeviceId,delegate (IEvent @event,EventCallBackHandle callBack) + { + try + { + switch ((IC_SE)(@event as SCChip_MakeIceCreamEvent).SteeringEngine) + { + case IC_SE.SE_1: + status["CompletedOpen_SE_1"] = false; + break; + case IC_SE.SE_2: + status["CompletedOpen_SE_2"] = false; + break; + case IC_SE.SE_3: + status["CompletedOpen_SE_3"] = false; + break; + } + package.Cmd = IC_CMD.OPEN_SE; + package.Value = (byte)(@event as SCChip_MakeIceCreamEvent).SteeringEngine; + commProxy.SendData(StructureToByte(package)); + + bool wait = true; + DateTime waitTimeout = DateTime.Now.AddSeconds(3); + while (wait) + { + wait = DateTime.Now < waitTimeout; + if (wait) + { + switch ((IC_SE)(@event as SCChip_MakeIceCreamEvent).SteeringEngine) + { + case IC_SE.SE_1: + wait = !(bool)status["CompletedOpen_SE_1"]; + break; + case IC_SE.SE_2: + wait = !(bool)status["CompletedOpen_SE_2"]; + break; + case IC_SE.SE_3: + wait = !(bool)status["CompletedOpen_SE_3"]; + break; + } + } + Thread.Sleep(10); + } + Thread.Sleep(2000); + package.Cmd = IC_CMD.CLOSE_SE; + package.Value = (byte)(@event as SCChip_MakeIceCreamEvent).SteeringEngine; + commProxy.SendData(StructureToByte(package)); + + wait = true; + waitTimeout = DateTime.Now.AddSeconds(3); + while (wait) + { + wait = DateTime.Now < waitTimeout; + if (wait) + { + switch ((IC_SE)(@event as SCChip_MakeIceCreamEvent).SteeringEngine) + { + case IC_SE.SE_1: + wait = !(bool)status["CompletedClose_SE_1"]; + break; + case IC_SE.SE_2: + wait = !(bool)status["CompletedClose_SE_2"]; + break; + case IC_SE.SE_3: + wait = !(bool)status["CompletedClose_SE_3"]; + break; + } + } + Thread.Sleep(10); + } + } + catch (Exception ex) + { + MessageLog.GetInstance.Show($"BPASmartClient.SCChip 中引发错误,ICChipMachine 类,描述:[{ex.Message}]"); + } + }); + + //STM32F103RCT6单片机舵机打开或者关闭 + EventBus.EventBus.GetInstance().Subscribe(DeviceId,delegate (IEvent @event,EventCallBackHandle callBack) + { + try + { + package.Cmd = (@event as SCChip_SESwitchCreamEvent).IsOpen ? IC_CMD.OPEN_SE : IC_CMD.CLOSE_SE; + package.Value = (byte)(@event as SCChip_SESwitchCreamEvent).SteeringEngine; + commProxy.SendData(StructureToByte(package)); + } + catch (Exception ex) + { + MessageLog.GetInstance.Show($"BPASmartClient.DRCoffee 中引发错误,CoffeeCommCmdHandler 类,描述:[{ex.Message}]"); + } + }); + + //STM32F103RCT6单片机控制冰淇淋机器转 + EventBus.EventBus.GetInstance().Subscribe(DeviceId,delegate (IEvent @event,EventCallBackHandle callBack) + { + try + { + package.Cmd = IC_CMD.ROTOR; + package.Value = (@event as SCChip_RotorSwitchEvent).TurnOn ? (byte)IC_ROTOR.OPEN_ROTOR : (byte)IC_ROTOR.CLOSE_ROTOR; + commProxy.SendData(StructureToByte(package)); + } + catch (Exception ex) + { + MessageLog.GetInstance.Show($"BPASmartClient.SCChip 中引发错误,ICChipMachine 类,描述:[{ex.Message}]"); + } + }); + } } diff --git a/BPASmartClient/MainWindow.xaml b/BPASmartClient/MainWindow.xaml index 526bfc3b..20f0da1c 100644 --- a/BPASmartClient/MainWindow.xaml +++ b/BPASmartClient/MainWindow.xaml @@ -10,6 +10,6 @@